是/否不起作用 do{ p++; printf(“输入您的姓名:”); scanf(“%s”,字符串(&s); fprintf(fw,“%d\n%s\n”,p,字符串); printf(“输入您的电话号码:”); scanf(“%d”、&cislo); fprintf(fw,“%d\n”,cislo); printf(“如果要添加更多数据,请按Y,否则请按N”); c=getchar(); 而(getchar()!='\n') ; 如果(c='Y') k++; 其他的 printf(“您决定不继续。”); }p
您好,代码的结尾似乎不起作用,因为当我输入Y时,它显示“您决定不继续”,这是胡说八道,因为它应该将k增加1,再增加一次(p和k在程序开始时声明,p=0;k=1;您能告诉我解决方案吗?您应该在读取其他内容之前清空是/否不起作用 do{ p++; printf(“输入您的姓名:”); scanf(“%s”,字符串(&s); fprintf(fw,“%d\n%s\n”,p,字符串); printf(“输入您的电话号码:”); scanf(“%d”、&cislo); fprintf(fw,“%d\n”,cislo); printf(“如果要添加更多数据,请按Y,否则请按N”); c=getchar(); 而(getchar()!='\n') ; 如果(c='Y') k++; 其他的 printf(“您决定不继续。”); }p,c,C,您好,代码的结尾似乎不起作用,因为当我输入Y时,它显示“您决定不继续”,这是胡说八道,因为它应该将k增加1,再增加一次(p和k在程序开始时声明,p=0;k=1;您能告诉我解决方案吗?您应该在读取其他内容之前清空stdin缓冲区 do { p++; printf("Enter your name: "); scanf("%s", &string); fprintf(fw, "%d\n%s\n",p, string);
stdin
缓冲区
do {
p++;
printf("Enter your name: ");
scanf("%s", &string);
fprintf(fw, "%d\n%s\n",p, string);
printf("Enter your telephone number: ");
scanf("%d",&cislo);
fprintf(fw, "%d\n",cislo);
printf("If u want to add more datas press Y otherwise press N ");
c = getchar();
while (getchar() != '\n')
;
if ( c == 'Y')
k++;
else
printf("You decided not to continue.");
} while (p < k);
此函数用于清空stdin缓冲区
void emptyBuffer() {
char c = 'a';
while (c != '\n' && c != EOF) {
c = getchar();
}
return;
}
因为当您使用getchar()
时,可能会得到上一个问题(/answer)的最后一个'\n'
顺便说一句(根据之前的评论)
你应使用:
printf("Enter your name: ");
scanf("%s", &string);
emptyBuffer();
fprintf(fw, "%d\n%s\n",p, string);
printf("Enter your telephone number: ");
scanf("%d",&cislo);
emptyBuffer();
fprintf(fw, "%d\n",cislo);
printf("If u want to add more datas press Y otherwise press N ");
c = getchar();
哪个更方便用户:)使用
c=getchar();
您正在读取电话号码输入的'\n'
(返回)
要避免它,您必须刷新stdin
,或者在这种情况下,调用getchar()
两次
另一种简单的方法是使用scanf完成工作:
if ( c == 'Y' || c == 'y' )
编辑
根据OP的要求,完整的解决方案可以是:
scanf("%s", c);
if (( c[0] == 'y') || ( c[0] == 'Y'))
k++;
您确定键入的是“Y”而不是“Y”?!更改您的条件并检查较低的“Y”。可能您需要这样的内容:
if(c=='Y'| c=='Y'){…}
。此外,c
应该是一个int
。是的,我确定我键入了Y,我甚至试着把c='Y'放在那里,键入Y,但都是一样的。编辑:while循环;before是因为在我按Y之后,可能会有重复的,您当然会在上次扫描之后删除左边的新行,对吗?Also当然,您试图通过打印出变量c实际包含的内容来调试代码。非常感谢您的工作,但是您能告诉我为什么我在代码中c=getchar()之前调用该函数,而不是之后调用该函数吗?假设用户响应:name:kaldoran\n(\n由于输入)scanf将获得“kaldoran”,然后编号:000000\n(再次输入)scanf将获得“000000”,但stdin再次包含“\n”,因此您需要删除该“\n”这就是为什么我们清空stdin缓冲区,以删除所有垃圾字符如果这一个有效,你能接受答案吗?Thxy抱歉,现在我明白了,非常感谢你,我以前忘记接受它了:D抱歉,现在我这么做了谢谢你的回复它也是这样工作的编辑:不,它有效,因为我声明了p=0和k=1,所以第一次它增加了如果我按n键p到1,不客气,先生。记住更改while条件。查看我以前的帖子我解释了do-while循环OK。我编辑了。我看到两者都是0。总之,正如我所说,这可能很愚蠢,如果你有更好的解决方案,还有更“聪明”的方法。你能写出来吗?
do
{
printf("Enter your name: ");
scanf("%s", &string);
fprintf(fw, "%d\n%s\n",p, string);
printf("Enter your telephone number: ");
scanf("%d",&cislo);
fprintf(fw, "%d\n",cislo);
printf("If u want to add more datas press Y otherwise press N: ");
scanf("%s", c);
} while (( c[0] == 'y') || ( c[0] == 'Y'));
printf("You decided not to continue.\n");