scanf放在循环判断句里面或者外面。运行结果不一样
{
int b;
while (scanf("%d", &b)!= 5)
{
if (5 > b)
cout << "猜小了" << endl;
else
cout << "猜大了" << endl;
}
cout<<("猜对了");
}
输入5,打印猜大了。
int main()
{
int b;
scanf("%d", &b);
while (b!= 5)
{
if (5 > b)
cout << "猜小了" << endl;
else
cout << "猜大了" << endl;
}
cout<<("猜对了");
}
打印猜对了
while (scanf("%d", &b)!= 5)
这个判断的不是b!=5而是scanf函数返回值!=5
而scanf函数返回值为成功读取的变量的个数
1.你把scanf放while前面,那只输入了一遍,而用这同一个值判断了5次
2.你不判断b==5,只要猜5次就算猜对了??
第一段:你的scanf放在while语句中就导致while的判断条件变为是判断scanf的返回值与5的比较,而scanf语句的返回值为成功输入变量的个数,所以输入5时scanf的返回值是不等于5的,进入while语句中后打印出猜大了。
第二段:是正确的形式。
int main()
{
int b;
scanf("%d", &b);
while (b!= 5)
{
if (5 > b)
cout << "猜小了" << endl;
else
cout << "猜大了" << endl;
scanf("%d", &b);
}
cout<<("猜对了");
}
代码如下:
double a = 0;
int b = 0;
char c = 0;
printf("请输入数据:>");
int ret = scanf ("%lf%d%c", &a, &b, &c);
printf("输出结果:%d", ret);
运行结果:
请输入数据:>1.0 2c
输出结果:3
这个问题主要是因为scanf函数读取用户输入后会将换行符留在输入缓冲区中,导致下次循环读取时会直接读取到缓冲区中的换行符,而不是用户输入的值。所以,如果scanf函数放在循环判断语句内部,每次循环读取时都需要先清空缓冲区中的换行符,才能正确读取用户输入的值。
优化解决方案:
#include <stdio.h>
int main() {
int a = 0;
int ret = 0;
char c = 'a';
while (1) {
printf("请输入一个十六进制数:");
ret = scanf("%x", &a);
while ((c = getchar()) != '\n' && c != EOF) {} // 清空换行符
if (ret == 1) {
break;
}
printf("输入错误,请重新输入!\n");
}
printf("输入的十六进制数为:%#x\n", a);
return 0;
}
#include <stdio.h>
int main() {
char input[50];
int a = 0;
while (1) {
printf("请输入一个十六进制数:");
fgets(input, sizeof(input), stdin);
if (sscanf(input, "%x", &a) == 1) {
break;
}
printf("输入错误,请重新输入!\n");
}
printf("输入的十六进制数为:%#x\n", a);
return 0;
}