Domanda

Sto cercando di analizzare alcuni input su un sistema incorporato. Mi aspetto qualcosa del genere:

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

Quando converto le stringhe separate in ints, sia atoi () che strtol () sembrano restituire 0 se la stringa inizia con 8.

Ecco il mio codice:

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);
}

Passandolo:

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

fornisce quanto segue nel mio debug uart:

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

UPDATE:

Ho controllato inBuffer sia prima che dopo 'value [i] = atoi (pch);' ed è identico e sembra essere stato diviso nel punto giusto.

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 

AGGIORNAMENTO 2:

La mia sezione UARTDEBUG attualmente recita:

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

Se commento la riga snprintf () , tutto funziona perfettamente. Quindi cosa sta succedendo?

È stato utile?

Soluzione

non puoi provare a scrivere il tuo atoi ? è lungo dieci righe e quindi puoi eseguirne il debug facilmente (e verificare dove si trova davvero il problema)

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

e così via, devi solo fare qualcosa come

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

per ogni cifra che hai

Altri suggerimenti

Non correlato, ma

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

dovrebbe essere

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

Può essere la causa del problema se altri pezzi di codice eseguono il controllo di overflow nel modo sbagliato e per questo motivo sovrascrivono parte della stringa

Ho appena provato a compilare ed eseguire il tuo codice di esempio sul mio sistema. L'output è corretto (ovvero "8" appare dove dovrebbe trovarsi nella stringa di output) il che mi indica che sta succedendo qualcos'altro al di fuori dell'ambito del codice che ci hai fornito.

Sto per uscire da un arto e dire che una delle tue variabili o funzioni sta calpestando la tua stringa di input o qualche altra variabile o matrice. SendLine e SetVariable sono luoghi da cercare.

Ma soprattutto, non ci hai fornito gli strumenti per aiutarti a risolvere il tuo problema . Quando chiedi alle persone di aiutarti a eseguire il debug del tuo programma, fornisci un semplice test case, con sorgente completa, che esemplifichi il problema . Altrimenti, siamo lasciati a indovinare qual è il problema, che è frustrante per noi e improduttivo per te.

atoi restituisce 0 per qualcosa che non può essere visualizzato come numerico - questo è solo un sospetto, ma hai provato a scaricare la rappresentazione binaria della stringa (o anche controllando che le lunghezze della stringa corrispondano)?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top