2015-01-15 29 views
0

我的問題陳述是接受一串數字並在屏幕上顯示不同的數字。所以我試着用strtok()將字符串分成不同的數字,然後用atoi()將這些數字轉換成數字。但我得到運行時錯誤..我還附上了一個示例代碼。在C中使用atoi()運行時錯誤

輸入

1 22 123 89 12 as a string 

輸出

1 22 123 89 12 as numbers 

我需要做的這些數字的數學運算。所以我必須從整數轉換爲字符串。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main() 
{ 
    int i,j; 
    char buffer [256]; 

    char *token; 
    const char s[2]= " "; 
    fgets (buffer, 256, stdin); 

    token=strtok(buffer,s); 
    i = atoi (token); 
    printf("%d \n",i); 
    while (token!=NULL) 
       {token=strtok(buffer,s); 
       i = atoi (token); 
       printf("%d ",i); 
       } 

    return 0; 
} 
+0

'atoi'段錯誤'NULL'指針。 –

+0

在調用atoi之前檢查'token!= NULL'。目前你在檢查null之前調用atoi。 –

回答

1

您需要先atoi()檢查token爲NULL本身。除此之外,strtol()的使用優於atoi()

這麼說,我想,以滿足您的目的,

while (token!=NULL) 
      {token=strtok(buffer,s); 

應該

while (token!=NULL) 
      {token=strtok(NULL,s); 

否則,你最終會從開始一遍又一遍解析輸入。

接下來,避免\n通過fgets(),使用分隔字符串像

char * s = " \n"; 
2

除了更改參數的循環您strtok調用read,你需要改變你打電話strtokatoi順序。現在,如果循環中的strtok返回NULL,它遲早會做什麼呢?

因此,

token=strtok(buffer,s); 
while (token!=NULL) 
{ 
    i = atoi (token); 
    printf("%d ",i); 
    token = strtok(NULL, " "); 
} 
0

作爲每的strtok的man page():

的的strtok()的函數把字符串轉換成標記序列。在第一次調用strtok()時,應該在str中指定要解析的字符串。在每個應該解析相同字符串的後續調用中,str應該爲NULL。

char *strtok(char *str, const char *delim); 

所以修改while循環如下(看看atoi()strtok()函數調用的順序):

while (token!=NULL) 
{ 
i = atoi (token); 
printf("%d ",i); 
token=strtok(NULL,s); 
} 

您還可以使用strtol這顯然比atoi更好。