2009-07-30 24 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是需要查看的地方。

但更重要的是,您還沒有給我們提供工具來幫助您解決問題。當要求人們幫助您調試程序時,提供了一個簡單的測試用例,其中包含完整的源代碼,它可以說明問題。否則,我們只能猜測問題是什麼,這對我們來說是令人沮喪的,對您而言是無用的。