鱼C论坛

 找回密码
 立即注册
查看: 2724|回复: 8

关于c = getchar()问题

[复制链接]
发表于 2012-6-18 15:38:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# include <stdio.h>

int main(void)
{
       int num;
       float score;
       char c = 'y';

      while(c == 'y' || c == 'Y')
      {
         printf("\n请输入学号:");
         scanf("%d", &num);

          printf("\n请输入成绩:");
         scanf("%f", &score);
         printf("\n你要继椟吗?");

        c = getchar();
      }

    return 0;
}






为什么我输入y的时候不会循环呢?
是不是哪里错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-18 18:02:55 | 显示全部楼层
int main(void)
{
       int num;
       float score;
       char c = 'y';

      while(c == 'y' || c == 'Y')
      {
         printf("\n请输入学号:");
         scanf("%d", &num);

          printf("\n请输入成绩:");
         scanf("%f", &score);
         printf("\n你要继椟吗?");
        getchar();
        c = getchar();
      }

这样就行了

    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-24 15:22:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-24 15:33:00 | 显示全部楼层
不过今天放到VC++6里面运行,怎么出现debug erro了呢,记得上次好像没有的......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-26 16:39:21 | 显示全部楼层
是字符缓冲流。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-26 19:33:39 | 显示全部楼层
你这个程序 我也想了很久 但是也想不通 后来问咯群里面的 的大神们  最后 了解了 一些   你在定义 num 和 score  两个变量没有初始化   接着你 执行 while 语句 但是 编译器不知道num 和 score 两个变量什么时候被初始化  因为 编译器 不知道 你的while 会不会被执行  即时 给c初始化 了 要被执行的条件  你这个 程序也提醒了 我们 编程  初始化 是个好习惯  下面是正确的源代码  有两种 :
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int num=0;
  5.         float score=0;
  6.         char c='y';

  7.         while(c=='y'||c=='Y')
  8.         {
  9.                 printf("请输入学号:");
  10.                 scanf("%d", &num);

  11.                 printf("请输入分数:");
  12.                 scanf("%f", &score);

  13.                 printf("需要继续吗? Y/N:");
  14.                 getchar();
  15.                 scanf("%c", &c);
  16.         }
  17.         return 0;
  18. }
复制代码
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int num;
  5.         float score;
  6.         char c;

  7.         do
  8.         {
  9.                 printf("请输入学号:");
  10.                 scanf("%d", &num);

  11.                 printf("请输入分数:");
  12.                 scanf("%f", &score);

  13.                 printf("需要继续吗? Y/N:");
  14.                 getchar();
  15.                 scanf("%c", &c);
  16.         } while (c == 'y' || c == 'Y');
  17.         return 0;
  18. }

复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-26 21:37:51 | 显示全部楼层
回答了半天,都说了些废话,还是没解决问题。。。这个是输入缓冲区清空的问题,很多新人都遇到过这个问题。 就是当你连续调用输入函数scanf,或者getchar,这类函数的时候,从键盘输入的内容会先存储在输入缓冲区,然后加载到内存,所以这里CPU每次会到输入缓冲区去提取键盘输入。一般调用了一次输入函数,完了以后,系统会自动清空输入缓冲区,但是如果你连续调用的话,系统还来不及清空,CPU去哪里提取内容的时候,只会去找哪里有没有内容,而不会管是你刚才输入的,还是之前没有清空的。

所以这样的情况需要手动去清空输入缓冲区。。。在getchar函数上一行加一个fflush(stdin);  这个函数是专门用来清空输入缓冲区的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-28 08:23:38 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-6-26 19:33
你这个程序 我也想了很久 但是也想不通 后来问咯群里面的 的大神们  最后 了解了 一些   你在定义 num 和 s ...

和初始化 完全没关系
scanf
%d %f 等不会读取'\n' 字符'\n'停留在输入缓冲里
%c getchar 可以读取字符'\n' 直接把缓冲里面的'\n'读走完成赋值
所以 读取字符之前要清空一下输入缓冲 fflush(stdin);
不过 我比较喜欢用一个循环
while(getchar()!='\n')
;
效果基本一样 随心情吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-28 16:26:45 | 显示全部楼层
我是师兄 发表于 2012-6-28 08:23
和初始化 完全没关系
scanf
%d %f 等不会读取'\n' 字符'\n'停留在输入缓冲里

明白了  嘿嘿  :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 12:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表