sscanf setzt Variable zurück



  • Hallo Gemeinde,

    das ist mein erster Post, also verzeiht mir bitte grobe Fehler.

    Ich habe folgendes Problem:

    Eine Funktion soll aus einem String Werte auslesen und in ein Array speichern.

    Dafür folgende Funktion:

    const char *pb_config_slave_0x8000 =
      "2d00020000000000000000000000a8010000f4"
      "f0000000000a02000000008801140b095f00800008d9e9";
    
    unsigned int strToCharArray(const char *str, unsigned char *buffer)
        {
            unsigned int i;
            unsigned char byteVal;
            //        const char *str = pb_config;
            //        unsigned char cf_data[256];
            size_t size = strlen(str);
    
            for (i = 0; i < size/2; i++) {
                sscanf(str, "%2X", &byteVal);
                str += 2;
                buffer[i] = (uint8_t) byteVal;
                printf(" buffer: %d, 0x%x\n", (i+1), buffer[i]);
            }
            return (size / 2);
        }
    
    //......
    int cnt;
    unsigned char pb_config_buf[256];
    
    cnt = strToCharArray(pb_config_slave_0x8000, pb_config_buf);
    

    Die Werte auslesen und korrekt in das Array schreiben klappt.
    Aber beim Debuggen und bei printf fiel mir auf, dass die Variable i immer wieder auf 0 gesetzt wird. D.h. Nachdem ersten Durlauf ist diese 1, sobald das Programm aber die Funktion sscanf() erreicht hat, wird diese wieder auf 0 gesetzt.

    Ich kann mir überhaupt nicht erklären wie das sein kann.

    Weis jemand einen Rat, danke.



  • sscanf() erwartet bei "%X" einen int und keinen char. Ich vermute mal dass so dein i am Stack überschrieben wird (buffer overflow)...



  • Wie schon erwähnt, solltest du für das Lesen von int auch an sscanf einen int-Speicherbereich übergeben. Du übergibst nur einen Speicherbereich von unsigned char und je nach Compilervariante und Endianness schreibt sscanf einen Speicherbereich von sizeof(int) und dabei wahrscheinlich (von dir ungewollt) in den Speicherbereich der Variable i, die direkt neben byteVal definiert wurde und somit erster Kandidat für das undefinierte Verhalten ist.



  • Ahh ok,

    nun das zu übergebene Array muss char sein. Also muss ich sscanf anpassen,
    so dass immer 2 chars eingelesen werde und dann in einem Feld abgespeichert werden.



  • HolyHit schrieb:

    [...] nun das zu übergebene Array muss char sein.

    aber byteVal muss nicht char sein...



  • mit:

    unsigned int byteVal;
    

    als Typen funktioniert es.

    vielen Dank


Anmelden zum Antworten