【发布时间】:2009-07-30 11:15:29
【问题描述】:
我正在尝试解析嵌入式系统上的一些输入。 我期待这样的事情:
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() 行,一切都会完美运行。那么这是怎么回事呢?
【问题讨论】:
-
value[] 的声明是什么?
-
如果你向我们展示整个函数(或者至少是所有接触到的变量的声明),可能会发现错误
-
可能不会导致您遇到的问题,但 atol() 可能是您更好的选择,因为您将其声明为有符号长值 [256]
-
格式有什么问题?只需执行
snprintf(convert, sizeof(convert), "Long:%ld=String:%s", value[i], pch);。特别注意%ld。