2009-07-30 40 views
1

我试图分析在嵌入式系统上的一些输入。 我期待这样的事情:Ç字符串转换为整数的问题

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 

给出我的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 

UPDATE:

我之前和之后检查inBuffer '值[I] =的atoi(PCH);'这是相同的,似乎已经分裂到正确的地步。

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

value []的声明是什么? – bstpierre 2009-07-30 11:22:39

+0

签名长值[256]; – Tim 2009-07-30 11:46:05

+0

如果您向我们展示整个函数(或者至少是所有触及的变量的声明),可能会发现该错误 – ahy1 2009-07-30 11:59:08

回答

1

不能尝试写自己的atoi? 它就像十条线长,那么你就可以轻松地调试它(和检查哪里出了问题真的是)

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

等,你只需要为每一位做类似

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

你有

0

的atoi返回0的东西,它不能渲染为数字 - 这仅仅是一种预感,但你尝试过倾销字符串的二进制表示(甚至检查字符串长度匹配)?

1

没有关系,但

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

应该

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

可能是问题的原因,如果代码的其他部分做的方式是错误的溢出检查和因为他们覆盖您字符串的一部分

1

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

我要走出一条腿,说你的一个变量或函数是践踏你的输入字符串或其他变量或数组。 SendLine和SetVariable是需要查看的地方。

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