我只是在学习链接列表。我为自己编写了一个关于链接列表机制的小程序。这是我第一次尝试做一个小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++;
}
答案 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'
或' '
)