2014-10-04 96 views
0
#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char string[10000],*token; 
    int garden[100],i=0; 
    fgets(string,10000,stdin); 
    token = strtok(string," "); 
    while(strcmp(token,"\n") != 0){ 
     garden[i] = atoi(token); 
     i++; 
     token = strtok(NULL," "); 
    } 
    return 0; 
} 

此代碼有什麼問題?爲什麼我不能從一行讀取空格分隔的整數?C fgets strtok和atoi在C中讀取一行

+0

如果未找到標記'strtok'返回空指針。 – user1336087 2014-10-04 08:42:23

回答

0

您的代碼僅在最終號碼後有空格時纔有效。否則strcmp()永遠不會返回非零值,您繼續在NULL指針上調用它。

+0

我的行後有一個換行符 – 2014-10-04 08:38:00

2

變化

while(strcmp(token,"\n") != 0){ 

while(token != NULL){ 
+0

+1,簡短的回答 - 就是這樣。 – soerium 2014-10-04 08:42:56

0

更改以下列方式代碼:

token = strtok(string, " \n"); 

while (token != NULL && i < 100) 
{ 
    garden[i] = atoi(token); 
    i++; 
    token = strtok(NULL, " \n"); 
} 
0

@Igor已經回答了你的問題,但請考慮替代解決方案。

#include <stdio.h> 

int main(void) { 
    int i = 0, garden[100]; 
    while(i < 100 && scanf(" %d", &garden[i++]) == 1); 
    return 0; 
} 
+1

我不確定這是否會按照他希望的方式工作,即在用戶輸入空格時用數字分隔,而不用按'\ n'來讀取數字。 – Igor 2014-10-04 08:47:16

+0

@Igor它接受'\ n'或EOF。 – soerium 2014-10-04 08:52:26

+0

你的解決方案的問題是'\ n'被忽略,停止輸入的唯一方法是Ctrl + D,這可能是件好事。如果考慮到這一點,我發現你的代碼工作正常。 – Igor 2014-10-04 08:57:23

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

int main(void) { 
int garden[10000],length = 0,i; 
char string[100]; 
fgets(string,100,stdin); 
char *token; 
token = strtok(string," "); 
while (token != NULL) { 
    if(strcmp(token,"\n") == 0) 
    break; 
    garden[length] = atoi(token); 
    token = strtok(NULL," "); 
    length++; 
} 
for(i=0; i<length;i++){ 
    printf("%d ",garden[i]); 
} 
return 0; 
} 

此代碼工作完美。不幸的是fgets也讀取換行符。所以不得不照顧這一點。