Question

J'essaie d'analyser certaines entrées sur un système intégré. J'attends quelque chose comme ça:

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

Lorsque je convertis des chaînes distinctes en ints, atoi () et strtol () semblent renvoyer 0 si la chaîne commence par 8.

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

En le passant:

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

donne ce qui suit dans mon débogage 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:

J'ai vérifié le inBuffer avant et après 'value [i] = atoi (pch);' et il est identique et semble avoir été divisé jusqu'au bon point.

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:

Ma section UARTDEBUG lit actuellement:

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

Si je commente la ligne snprintf () , tout fonctionne parfaitement. Alors, qu'est-ce qui se passe avec ça?

Était-ce utile?

La solution

ne pouvez-vous pas essayer d'écrire votre propre atoi ? c'est comme si dix lignes de long et ensuite vous pouvez le déboguer facilement (et vérifier où le problème est vraiment)

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

et ainsi de suite, il vous suffit de faire quelque chose comme

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

pour chaque chiffre que vous avez

Autres conseils

Pas lié, mais

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

devrait être

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

Peut être la cause du problème si d'autres morceaux de code effectuent le contrôle de débordement de manière incorrecte et à cause de cela, ils écrasent une partie de votre chaîne

Je viens d'essayer de compiler et d'exécuter votre exemple de code sur mon propre système. La sortie est correcte ("8" apparaît à l'endroit où elle devrait figurer dans la chaîne de sortie), ce qui m'indique qu'il se passe autre chose en dehors de la portée du code que vous nous avez fourni.

Je vais sortir d'un membre et dire qu'une de vos variables ou fonctions piétine votre chaîne d'entrée ou une autre variable ou tableau. SendLine et SetVariable sont des endroits à regarder.

Mais surtout, vous ne nous avez pas fourni les outils nécessaires pour vous aider à résoudre votre problème . Lorsque vous demandez aux utilisateurs de vous aider à déboguer votre programme, fournissez un scénario de test simple, avec source complète, illustrant le problème . Sinon, nous devrons deviner quel est le problème, ce qui est frustrant pour nous et improductif pour vous.

atoi renvoie 0 pour quelque chose qu'il ne peut pas rendre sous forme numérique - ceci n'est qu'un pressentiment, mais avez-vous essayé de vider la représentation binaire de la chaîne (ou même de vérifier que les longueurs de chaîne correspondent)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top