一个非常简单的问题。为什么在第一个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;
}
答案 0 :(得分:6)
这是因为scanf
会在输入缓冲区中留下'\n'
(endline)符号。在getchar
循环的第一次迭代中,while(1)
将使用此符号。
答案 1 :(得分:3)
getchar()
在输入缓冲区中留下一个换行符,后续的scanf()会读取该换行符。
您可以使用scanf中的前导空格来解决此问题:
scanf(" %c ...", &c,..);
告诉scanf忽略所有空格字符。或者在第一个getchar()之后立即使用另一个getchar()
来使用换行符。
答案 2 :(得分:1)
只需在getchar()
之后使用另一个scanf()
来消耗换行符。