scanf的getchar函数被跳过

一个非常简单的问题。 为什么在第一个while循环中跳过scanf? 我已经通过使用getchar()来尝试它,结果是一样的。 getchar被跳过。

如果你们不明白我在说什么,你可以尝试编译它,你们会明白我在问什么。

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct rec{ int num; char pref[16]; float point; struct rec* next; }rec; void dataInput(float*,char*); rec* insertNode(rec*); int main(){ int i=1; rec* entr,*pt = NULL; entr = (rec*) malloc(sizeof(rec)); entr->num = i; dataInput(&entr->point,entr->pref); entr->next = NULL; char key; i++; while(1){ printf("Continue ? If YES press 'y',or NO press 'n'\n"); key = getchar(); if(key == 'n')break; else if(key == 'y'){ if(!pt){ pt = insertNode(entr); }else{ pt = insertNode(pt); } dataInput(&pt->point,pt->pref); pt->num = i; i++; continue; }else{ printf("Wrong key! Please Press again! \n"); } } pt = entr; while(pt){ printf("num : %d, pref : %s, point: %.1f\n", pt->num, pt->pref, pt->point); pt = pt->next; } getchar(); getchar(); return 0; } void dataInput(float* point,char* pref){ printf("Input Point\t : "); scanf("%f",point); printf("Input Pref\t : "); scanf("%s",pref); } rec* insertNode(rec* current){ rec* newnode = (rec*)malloc(sizeof(rec)); current->next = newnode; newnode->next = NULL; return newnode; } 

这是因为scanf会在input缓冲区中留下'\n' (endline)符号。 while(1)循环的第一次迭代时,该符号将由getchar消耗。

getchar()在由后续scanf()读取的input缓冲区中留下换行符。

您可以使用scanf中的前导空格来解决这个问题:

 scanf(" %c ...", &c,..); 

它告诉scanf忽略所有的空白字符。 或者在第一个getchar()之后使用另一个getchar() )来使用换行符。