2014-10-04 97 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也读取换行符。所以不得不照顾这一点。