我正在尝试解析嵌入式系统上的一些输入。 我期待这样的事情:
SET VARNAME=1,2,3,4,5,6,7,8,9,10\0
当我将单独的字符串转换为整数时,如果字符串以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并且它是相同的,似乎已被分割到正确的位置。
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()
行,那么一切都很完美。那是怎么回事?
答案 0 :(得分:1)
不相关,但
if(i > sizeof(value)-1)
{
return;
}
应该是
if(i == sizeof(value)/sizeof(value[0]) )
{
return;
}
如果其他代码以错误的方式执行溢出检查,并且因为它们会覆盖部分字符串,则可能是问题的原因
答案 1 :(得分:1)
你不能尝试自己编写atoi
吗?
它就像十行长,然后你可以轻松地调试它(并检查问题的确切位置)
0x30
0x31
等等,你只需要做一些像
这样的事情string[x] - 0x30 * pow(10, n)
您拥有的每个数字
答案 2 :(得分:1)
我刚刚尝试在自己的系统上编译和运行示例代码。输出是正确的(即'8'出现在它应该在输出字符串中的位置),它向我表明在你提供给我们的代码范围之外还有其他事情发生。
我要指出你的一个变量或函数正在践踏你的输入字符串或其他变量或数组。 SendLine和SetVariable是值得一看的地方。
但更重要的是,您没有给我们提供帮助您解决问题的工具。当要求人们帮助您调试程序时,提供一个简单的测试用例,其中包含完整的源代码,以示例解决问题。否则,我们只能猜测问题是什么,这对我们来说是令人沮丧的,对你来说也没有效果。
答案 3 :(得分:0)
atoi返回0表示无法呈现为数字的东西 - 这只是一个预感,但您是否尝试转储字符串的二进制表示(甚至检查字符串长度是否匹配)?