C fgets strtok和atoi在C中读取一行

时间:2014-10-04 08:20:53

标签: c fgets strtok atoi

#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;
}

这段代码有什么问题?为什么我不能从一行读取空格分隔的整数?

5 个答案:

答案 0 :(得分:2)

更改

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

while(token != NULL){

答案 1 :(得分:0)

只有在最终号码后面有空格时,您的代码才有效。否则strcmp()永远不会返回非零值,您继续在NULL指针上调用它。

答案 2 :(得分:0)

按以下方式更改代码:

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

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

答案 3 :(得分:0)

@Igor已经回答了你的问题,但请考虑替代解决方案。

#include <stdio.h>

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

答案 4 :(得分: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也会读取换行符。所以不得不照顾好。