2012-03-26 81 views
2

我想從輸入行中提取一些字符串。該字符串看起來是這樣的:解析輸入行c

command 1 2 3 4 5 

到目前爲止,我已經做到了這一點,但它不能正常工作:

if (strncmp(line,"command",7) == 0){ 
      char *p = strtok(line," "); 
      while (p !=NULL){ 
       param1 = atoi(p[1]); 
       param2 = atoi(p[2]); 
       param3 = atoi(p[3]); 
       param4 = atoi(p[4]); 
       param5 = atoi(p[5]); 
       p = strtok(NULL," "); 
      } 
    } 

我在哪裏錯了?

+0

你爲什麼要把p [x]的地址?您必須手動清空atoi函數的字符串才能正常工作 – Ulterior 2012-03-26 13:33:35

+0

'strtok()'通過一次提供一個令牌來工作。對於多個令牌,您需要多次調用該函數。 – pmg 2012-03-26 13:36:16

+0

strtok已棄用。看看使用strsep - 請參閱手冊頁。 – 2012-03-26 13:38:39

回答

3

使用sscanf可能比較簡單:

if (strncmp(line, "command", 7) == 0) 
{ 
    sscanf(&line[8], "%d %d %d %d %d", &param1, &param2, &param3, &param4, &param5); 
} 
+0

耶!這是更簡單的方式...謝謝! – 2012-03-26 13:42:32

3

你爲什麼& P [1]? p是while循環中當前標記的指針。它不會像你期待的那樣給你所有的元素。

你可以聲明param爲一個數組:int param [5];

並改寫像循環:

int i=0; 
    while (p !=NULL){ 
        param[i++] = atoi(p); 
        p = strtok(NULL," "); 
    } 

如果你要使用5個變量參數1一樣,參數2 ....等,那麼你必須展開循環,並手工編寫,不是一個好主意。

-1
#include <string.h> 
int main(){ 
     char line[]="command 1 2 3 4 5"; 
     if (strncmp(line,"command",7) == 0){ 
       char *p = strtok(line," ");   
       while (p !=NULL){     
      printf("%s\n",p); 
        p = strtok(NULL," "); 
       } 
     } 
    }