一个简单小程序,奇怪
#include "stdio.h"
int main()
{
char ch = 0;
while(1)
{
printf("Continue....? <Y/N>\n");
//scanf(" %c ",&ch); //如果用scanf代替,则" %c "必须空格,为什么?
ch = getchar(); //只接受了一次输入,为什么?
if( ((ch !='y') && (ch !='Y')) )
break; //结束整个循环
else
ch = 0;
continue;//结束本次循环,并判断下次循环是否成立.
}
return 0;
}
我想实现的是,按Y或y继续循环,否则就退出,但现在程序执行后,不管按什么就退出了..
//scanf(" %c ",&ch); //如果用scanf代替,则" %c "必须空格,为什么?
ch = getchar(); //只接受了一次输入,为什么?
求解...
[解决办法]
- C/C++ code
ch = getchar();//当你输入第一次后,输入缓冲区会有数据残留(回车)在前边加个fflush(stdin);
[解决办法]
scanf("%c", &ch); 这样用,"%c"这里面别有空格
[解决办法]
[解决办法]
楼主去了解一下输入输出缓冲区
- C/C++ code
#include "stdio.h"int main(){ char ch = 0; while(1) { printf("Continue....? <Y/N>\n"); scanf("%c",&ch); //如果用scanf代替,则" %c "必须空格,为什么? fflush(stdin); // 刷新输入缓冲区, 去掉回车的影响,回车也是一个字符 // ch = getchar(); //只接受了一次输入,为什么? if( ((ch !='y') && (ch !='Y')) ) break; //结束整个循环 else ch = 0; continue;//结束本次循环,并判断下次循环是否成立. } return 0;}
[解决办法]
scanf("%d",&n); 因为你在这里输入的时候 系统接收了个字符和你按的回车换行符 而只把字符给了变量n 说明还有个换行符留在缓存中 scanf(" %c",&c);
[解决办法]
所以这个空格是接收换行符的 如果没有空格 系统会直接把换行符赋值给c 自然不会要你输入了
[解决办法]
单步调试和设断点调试是程序员必须掌握的技能之一。
[解决办法]
楼主这个问题解决了吗?
fflush(stdin);or scanf(" %c ", &ch);都不能实现要求的功能啊!
[解决办法]
怎么解决的·。。·楼主··
[解决办法]
[解决办法]
输入y,敲一下回车 这三个送进了缓冲区 y\r\n
缓冲区还残留了 '\n'这个字符。
下次的时候ch直接get了。
- C/C++ code
//你连续输入5个y试试,会直接循环5次#include "stdio.h"#include "windows.h"int main(){ char ch = 0; while(1) { printf("Continue....? <Y/N>\n"); ch = getchar(); if( ((ch !='y') && (ch !='Y')) ) break; Sleep(500); } return 0;}
[解决办法]
scanf(" %c ",&ch); //如果用scanf代替,则" %c "必须空格,为什么?
因为你输入时需要按回车,这是的回车被读进了缓冲区,而scanf中的空格就是将存入缓冲区的回车符读入,避免在后面当做有效字符读入
[解决办法]
if( ((ch !='y') && (ch !='Y')) )
break; //结束整个循环
else
ch = 0;
条件出错
这个条件永远成立啊,任何一个字符都不可能同时是y和Y的
应该改为
if( ((ch !='y') || (ch !='Y')) )
break; //结束整个循环
else
ch = 0;
[解决办法]
+个getchar()吃掉回车
#include "stdio.h"
int main()
{
char ch = 0;
while(1)
{
printf("Continue....? <Y/N>\n");
// scanf(" %c ",&ch); //如果用scanf代替,则" %c "必须空格,为什么?
ch = getchar(); //只接受了一次输入,为什么?
getchar();
if( ((ch !='y') && (ch !='Y')) )
break; //结束整个循环
else
ch = 0;
continue;//结束本次循环,并判断下次循环是否成立.
}
return 0;
}
[解决办法]
[解决办法]
一定要清空缓冲区,否则就会出现这种情况
[解决办法]
支持楼上
[解决办法]
5楼的方法是很好的,你主要是对C语言中的一些函数的深层含义没有理解,才会出现这样的问题。
[解决办法]
这不挺好吗
- C/C++ code
#include<stdio.h>int main(){ char ch=0; while(1) { printf("Continue....? <Y/N>\n"); scanf(" %c",&ch);//需输入两个字符才进行判断,为什么? if(((ch!='y')&&(ch!='Y')))break; //fflush(stdin); } return 0;}
[解决办法]
把scanf中的空格换成\n或者\r也一样,目的是跳过缓冲区的那个回车符,其实准确的来说应该是
scanf("\r\n%c",&ch);但是在此,cmd中空格回车换行基本上作用一样,都表示字符串结束,
遇到字符串结束符则表示输入结束
当输入内容是内容是y y y,scanf(" %c",&ch);
输出
Continue....? <Y/N>
Continue....? <Y/N>
Continue....? <Y/N>
当输入内容是y回车y回车,scanf("\r\n%c",&ch);
输出正常