链表中的字符串输入[C]

时间:2016-06-10 21:20:46

标签: c string list input fgets

我只是在学习链接列表。我为自己编写了一个关于链接列表机制的小程序。这是我第一次尝试做一个小pokedex(没有实际保存任何东西)。所以我正在尝试正确设置输入。目前一切正常,没有错误,我可以执行它。

问题是第二次输入口袋妖怪名称,它没有在任何数据中读取,而是跳过读入并直接进入scanf函数,为什么会这样呢?

void addPokemon(void){

    pokemonPtr firstPtr;
    pokemonPtr thisPokemon;
    firstPtr = NULL;

    firstPtr =(pokemon *) malloc(sizeof(pokemon));
    firstPtr->name = malloc(sizeof(char) * POKEMON_LENGTH);

    printf ("Enter the name of the Pokemon.\n");
    fgets(firstPtr->name, POKEMON_LENGTH, stdin);

问题就在这里,这个fgets并没有真正被执行,所以基本上它不会提示用户输入字符串。

    printf ("Enter the number of the Pokemon.\n");
    scanf("%d",&firstPtr->number);

    firstPtr->next =(pokemon *) malloc(sizeof(pokemon));

    thisPokemon = firstPtr->next;

    int i = 0;

    while (i < 10){

        thisPokemon->name = malloc(sizeof(char) * POKEMON_LENGTH);

        printf ("Enter the name of the Pokemon.\n");
        fgets(thisPokemon->name, POKEMON_LENGTH, stdin);
        printf ("Enter the number of the Pokemon.\n");
        scanf("%d",&thisPokemon->number);

        thisPokemon->next =(pokemon *) malloc (sizeof(pokemon));
        thisPokemon = thisPokemon->next;

        i++;

    }

2 个答案:

答案 0 :(得分:0)

fgets在读取换行符时停止读取。在你的例子中,stdin中已经有一个'\ n',所以fgets接受它并完成。这是因为scanf不会读取您输入数字时获得的换行符,而是将其保留在stdin中。

两种解决方案:

使用scanf("%s", name);代替fgets。这是有效的,因为%s将在字符串之前忽略空格和换行符。

用户getchar()来读取换行符。

答案 1 :(得分:0)

您的代码存在很多问题,扫描语句扫描从先前扫描语句返回的\n字符...您可以通过多种方式避免它,但所有这些方式最终会消耗{{1} } character

一些方法是:

  • \n 此空间使用 scanf(" "); 字符
  • \n 同样

    我在下面的代码中使用了第一个。

注意:始终确保在指定的getch();下方输入神奇宝贝的name。如果没有,则由下一个扫描声明接收。

如果,POKEMON_LENGTH,则始终输入口袋妖怪名称#define POKEMON_LENGTH 15或更少的字符,因为第15个空格用于14,并且上面的任何内容都会调用未定义的行为......

我已对您的\0功能进行了更改:(我在评论中已经过期)

addPokemon()

最后,

  

为什么要留出空间?

     

通过提供空格,编译器会消耗void addPokemon(void) { pokemonPtr firstPtr; pokemonPtr thisPokemon; firstPtr = NULL; firstPtr =(pokemon *) malloc(sizeof(pokemon)); firstPtr->name = malloc(sizeof(char) * POKEMON_LENGTH); printf ("Enter the name of the Pokemon.\n"); fgets(firstPtr->name, POKEMON_LENGTH, stdin); printf ("Enter the number of the Pokemon.\n"); scanf(" %d",&firstPtr->number); //give a space to consume \n firstPtr->next =(pokemon *) malloc(sizeof(pokemon)); thisPokemon = firstPtr->next; int i = 0; while (i < 10) { thisPokemon->name = malloc(sizeof(char) * POKEMON_LENGTH); printf ("Enter the name of the Pokemon.\n"); scanf(" ");//consume white spaces or \n fgets(thisPokemon->name, POKEMON_LENGTH, stdin); printf ("Enter the number of the Pokemon.\n"); scanf(" %d",&thisPokemon->number); thisPokemon->next =(pokemon *) malloc (sizeof(pokemon)); thisPokemon = thisPokemon->next; i++; } } } 个字符或上一个'\n'中的任何其他空格('\0''\t'' '