Frage

Ich versuche, Eingaben in ein eingebettetes System zu analysieren. Ich erwarte so etwas:

SET VARNAME=1,2,3,4,5,6,7,8,9,10\0

Wenn ich die getrennten Saiten in INTs konvertiere, beide, beide atoi() und strtol() scheinen 0 zurückzukehren, wenn die Zeichenfolge mit 8 beginnt.

Hier ist mein Code:

char *pch, *name, *vars;
signed long value[256];
int i;

#ifdef UARTDEBUG
    char convert[100];
#endif
if(strncmp(inBuffer, "SET",3)==0)
{
    pch = strtok(inBuffer," ");
    pch = strtok(NULL," ");
    name = strtok(pch, "=");
    vars = strtok(NULL,"=");

    pch = strtok(vars,",");

    i = 0;
    while(pch != NULL)
    {
        value[i] = atoi(pch);
        #ifdef UARTDEBUG
            snprintf(convert, sizeof(convert), "Long:%d=String:\0", value[i]);
            strncat(convert, pch, 10);
            SendLine(convert);
        #endif
        i++;
        pch = strtok(NULL,",");

        // Check for overflow
        if(i > sizeof(value)-1)
        {
            return;
        }
    }    

    SetVariable(name, value, i);
}

Bestehen:

SET VAR=1,2,3,4,5,6,7,8,9,10\0

gibt in meinem UART -Debug die Folgen:

Long:1=String:1                                                                
Long:2=String:2                                                                
Long:3=String:3                                                                
Long:4=String:4                                                                
Long:5=String:5                                                                
Long:6=String:6                                                                
Long:7=String:7                                                                
Long:0=String:8                                                                
Long:9=String:9                                                                
Long:10=String:10

AKTUALISIEREN:

Ich habe den InBuffer sowohl vor als auch nach 'Wert [i] = atoi (pch) überprüft; Und es ist identisch und scheint auf dem richtigen Punkt aufgeteilt worden zu sein.

S  E  T     V  A  R     1     2     3     4     5     6     7     8     9  ,  1  0
53 45 54 00 56 41 52 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 2c 31 30 00 00 00 00 

Update 2:

Mein Uartdebug -Bereich lautet derzeit:

        #ifdef UARTDEBUG
            snprintf(convert, 20, "Long:%ld=String:%s", value[i], pch);
            SendLine(convert);
        #endif

Wenn ich das kommentiere snprintf() Linie, alles funktioniert perfekt. Also, was ist damit los?

War es hilfreich?

Lösung

Kannst du nicht versuchen, deine eigenen zu schreiben? atoi? Es ist wie zehn Zeilen lang und dann können Sie es leicht debuggen (und überprüfen, wo das Problem wirklich ist)

  • '0' = 0x30
  • '1' = 0x31

Und so weiter muss man nur so etwas tun

string[x] - 0x30 * pow(10, n)

Für jede Ziffer haben Sie

Andere Tipps

Nicht verwandt, aber

if(i > sizeof(value)-1)
                {
                        return;
                }

sollte sein

if(i == sizeof(value)/sizeof(value[0]) )
                {
                        return;
                }

Kann die Ursache des Problems sein, wenn andere Codestücken die Überlaufsrunde auf die falsche Weise durchführen und aus diesem Grund einen Teil Ihrer Zeichenfolge überschreiben

Ich habe gerade versucht, Ihren Beispielcode auf meinem eigenen System zu kompilieren und auszuführen. Die Ausgabe ist korrekt (dh '8' erscheint dort, wo sie sich in der Ausgangszeichenfolge befinden sollte), was mir angibt, dass etwas anderes außerhalb des Umfangs des Code, den Sie uns zur Verfügung gestellt haben, etwas anderes vor sich geht.

Ich werde auf ein Glied ausgehen und sagen, dass eine Ihrer Variablen oder Funktionen darin besteht, Ihre Eingangszeichenfolge oder eine andere Variable oder ein anderes Array zu trampeln. Sendline und setvariable sind Orte, die Sie suchen müssen.

Aber noch wichtiger, Sie haben uns die Tools nicht gegeben, mit denen Sie Ihr Problem lösen können. Wenn Sie Leute bitten, Ihnen zu helfen, Ihr Programm zu debuggen, Geben Sie einen einfachen Testfall mit vollständiger Quelle an, der das Problem veranschaulicht. Ansonsten werden wir erraten, was das Problem ist, was für uns frustrierend und für Sie unproduktiv ist.

ATOI kehrt 0 für etwas zurück, das es nicht als numerisch rendern kann - dies ist nur eine Ahnung, aber haben Sie versucht, die binäre Darstellung der Zeichenfolge abzuwerfen (oder sogar zu überprüfen, ob die Stringlängen übereinstimmen)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top