问一个C语言细节的问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 12:03:30
判断一个数十基数还是偶数,扫描一次b的值(或者ch的值)看是否再判断一个数,用整形b可以 但是用ch就是不可以
#include "stdio.h"
#include "conio.h"

main()
{int a,b=1,c;
char ch='y';
while(b==1){
scanf("%d",&a);
if(a%2==0)printf("%d is a oshu\n",a);
if(a%2==1)printf("%d is a jishu\n",a);
printf("go on? 0 or 1?\n");
scanf("%d",&b);}
getch();}

#include "stdio.h"
#include "conio.h"

main()
{int a,b=1,c;
char ch='y';
while(ch=='y'){
scanf("%d",&a);
if(a%2==0)printf("%d is a oshu\n",a);
if(a%2==1)printf("%d is a jishu\n",a);
printf("go on? y or n?\n");
scanf("%c",&ch);}
getch();}

上面的用b判断要不要继续可以判断 用字符型ch判断执行两次就跳出来了 不知道是哪里的问题 肯定是细节的问题

这是因为你在输入a后,后面的回车还放在键盘的输入缓冲区里,当后面需要输入,就可能会从缓冲区里取出回车给它。第一个程序,由于最后的格式化输入是数字,回车不符合要求,被抛弃。第二个程序,最后的格式化输入是字符,字符可以是回车,TAB跳格等等,所以回车就给ch了。输入之前清空缓冲区就不会这样了
#include "stdio.h"
#include "conio.h"

main()
{
int a,b=1,c;
char ch='y';
while (ch=='y')
{
scanf("%d",&a);
if (a%2==0)printf("%d is a oshu\n",a);
if (a%2==1)printf("%d is a jishu\n",a);
printf("go on? y or n?\n");
fflush(stdin); // 清空缓冲区
scanf("%c",&ch);
}
getch();
}

这是典型的按回车导致字符变量输入错误.按回车键实际上输入了两个字符,第一个字符被用来确认scanf输入结束,还有一个字符仍然保留在了输入缓冲区内,会被下一个scanf或者其它读取字符的语句读到.因此,正确的做法是在读取字符数据前先清空一下输入缓冲区,可以用fflush(stdin);实现这一点.

这是一个C语言里的陷阱。
要注意在C里。回车键也是一个字符
所以当你第一次输入的时候数字结束时你会按回车。
而这个回车就赋值给了ch,所以直接跳出判断

#include "stdio.h"
#include "conio