C将字符串转换为Ints问题

我正在尝试解析嵌入式系统上的一些输入。 我期待这样的事情:

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

当我将单独的字符串转换为int时,如果字符串以8开头, atoi()strtol()似乎都返回0。

这是我的代码:

 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。 并且它是相同的,似乎已分裂到正确的位置。

 SETVAR 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 – 这只是一个预感,但你是否试过转储字符串的二进制表示(甚至检查字符串长度是否匹配)?