我想要分析一些输入一个嵌入式系统。我希望事情是这样的:

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

当我转换的独立的串整数,既 atoi()strtol() 似乎是返回0如果串的开始于8.

这里是我的代码:

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

给出了以下在我的串口调试:

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

更新:

我已经检查的inBuffer之前和之后的价值[i]=atoi(遗);',这是完全相同,并似乎已经分裂到右边一点。

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() 线,一切都完美的作品。所以,这是怎么回事?

有帮助吗?

解决方案

你可不可以尝试自己写 atoi?这就像十线漫长,然后你可以试很容易(和检查问题出在哪里真的是)

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

等等,你只需要做这样的事情

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

对每个数字你有

其他提示

不相关,但

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

应该是

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

如果其他代码以错误的方式执行溢出检查,并且因为它们会覆盖部分字符串,则可能是问题的原因

我刚刚尝试在自己的系统上编译和运行示例代码。输出是正确的(即'8'出现在它应该在输出字符串中的位置),它向我表明在你提供给我们的代码范围之外还有其他事情发生。

我要走出困境说你的一个变量或函数正在践踏输入字符串或其他变量或数组。 SendLine和SetVariable是值得一看的地方。

但更重要的是,您没有给我们提供帮助您解决问题的工具。当要求人们帮助您调试程序时,提供一个简单的测试用例,其中包含完整的源代码,可以解决问题。否则,我们只能猜测问题是什么,这对我们来说是令人沮丧的,对你来说也没有效果。

atoi返回0表示无法呈现为数字的东西 - 这只是一个预感,但您是否尝试转储字符串的二进制表示(甚至检查字符串长度是否匹配)?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top