1

組み込みシステムで入力を解析しようとしています。私はこのようなものを期待しています:

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

個別の文字列を int に変換しているときに、文字列が 8 で始まる場合、両方とも 0 を返しているようですatoi()strtol()

これが私のコードです:

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

それを渡す:

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

私の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

アップデート:

「value[i] = atoi(pch);」の前後に inBuffer をチェックしました。それは同一であり、適切なポイントで分割されているように見えます。

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 

更新 2:

私の UARTDEBUG セクションは現在次のようになっています。

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

行をコメントアウトするとsnprintf()、すべてが完全に機能します。それで、それで何が起こっているのですか?

4

4 に答える 4

1

関係ありませんが、

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

する必要があります

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

他のコードが間違った方法でオーバーフロー チェックを行い、そのために文字列の一部を上書きすると、問題が発生する可能性があります。

于 2009-07-30T12:05:13.720 に答える
1

サンプル コードを自分のシステムでコンパイルして実行しようとしました。出力は正しいです (つまり、出力文字列の本来あるべき場所に '8' が表示されます)。これは、提供されたコードの範囲外で何か他のことが起こっていることを示しています。

私は手足に出て、変数または関数の1つが入力文字列または他の変数または配列を踏みにじっていると言います。SendLine と SetVariable は注目すべき場所です。

しかし、もっと重要なのは、問題の解決に役立つツールを提供していないことです。プログラムのデバッグを手伝ってくれるよう人に依頼するときは、問題を例示する簡単なテスト ケースと完全なソースを提供してください。それ以外の場合は、何が問題なのかを推測するしかありません。これは、私たちにとって苛立たしく、あなたにとって非生産的です。

于 2009-08-02T06:24:50.053 に答える
1

自分で書いてみませんatoiか?これは 10 行ほどの長さで、簡単にデバッグできます (実際に問題がどこにあるかを確認できます)。

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

など、次のようなことをするだけです

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

あなたが持っている数字ごとに

于 2009-07-30T12:57:03.877 に答える
0

atoi は、数値としてレンダリングできないものに対して 0 を返します。これは単なる推測ですが、文字列のバイナリ表現をダンプしようとしましたか (または文字列の長さが一致することを確認しましたか)?

于 2009-07-30T11:55:46.970 に答える