首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个简单小程序,奇怪解决办法

2012-04-12 
一个简单小程序,奇怪#include stdio.hint main(){char ch 0while(1){printf(Continue....?Y/N\n)

一个简单小程序,奇怪
#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"这里面别有空格
[解决办法]
探讨
//scanf(" %c ",&ch); //如果用scanf代替,则" %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);都不能实现要求的功能啊!
[解决办法]
怎么解决的·。。·楼主··
[解决办法]
探讨

scanf(" %c",&amp;ch);这样是能实现的···
ch=getchar();却不能啊···好奇怪·

[解决办法]
输入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;
}
[解决办法]

探讨
if( ((ch !='y') &amp;&amp; (ch !='Y')) )
break; //结束整个循环
else
ch = 0;

条件出错
这个条件永远成立啊,任何一个字符都不可能同时是y和Y的

应该改为
if( ((ch !='y') || (ch !='Y')) )
break; //结束整个循环
else
ch = 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",&amp;ch);但是在此,cmd中空格回车换行基本上作用一样,都表示字符串结束,
遇到字符串结束符则表示输入结束
当输入内容是内容是y y y,scanf(" %c",&ch);
输出
Continue....? <Y/N>
Continue....? <Y/N>
Continue....? <Y/N>
当输入内容是y回车y回车,scanf("\r\n%c",&ch);
输出正常

热点排行