循环控制问题:为什么出现两次“Is the number 75?Y or N?”

liu2002119 2021-04-06 09:06:12
#include <stdio.h>
#define MIN 0
#define MAX 100
int main(void)
{
int number = (MIN + MAX) / 2;
char c = 'N';
int compare;

printf ("Let me guess the number.\n");
while (c != 'Y')
{
printf ("Is the number %d?Y or N?\n", number);
scanf ("%c", &c);
if (c == 'Y')
break; //number为所求值
if (c == 'N')
{
printf ("1) bigger 2)smaller\n Please choose 1 or 2!\n");
scanf ("%d", &compare);
if (compare == 1)
number = (number + MAX) / 2;
if (compare == 2)
number = (number + MIN) / 2;
}
}
printf ("So, the number is %d.\n", number);

return 0;
}


Let me guess the number.
Is the number 50?Y or N?
N
1) bigger 2)smaller
Please choose 1 or 2!
1
Is the number 75?Y or N?
Is the number 75?Y or N?
Y
So, the number is 75.


为什么出现两次“Is the number 75?Y or N?”
...全文
414 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu2002119 2021-04-15
  • 打赏
  • 举报
回复
谢谢了
qzjhjxj 2021-04-14
  • 打赏
  • 举报
回复
代码里刚好前面一个scanf("%c"),后面一个scanf("%d"),又刚好都在while()循环里。缓冲区一般不会自己释放的,就像代码里改的,一种是用getchar()吸收一个字符,或是在scanf()前面加 rewind(stdin)清除标准输入的按键缓冲区。
qzjhjxj 2021-04-14
  • 打赏
  • 举报
回复
//用scanf输入数值类型(int、float、double等)
//空格、回车、Tab键不会中断输入,scanf从第一个非空格/回车数值开始录入,即不管中间有多少空格有多少回车,
//都不会中断scanf的录入,除非到达scanf中规定的录入数量或遇到非数值类型时scanf("%d",&a[i++])!=1条件成立。
//格式:scanf(“输入控制符”, 输入参数);
//  当scanf控制符是字符”%c“的时候,要注意回车,回车也是一个字符,当我们连续输入两个整数,回车/空格都属于字符,都会被下一轮的
//scanf(“%c”,&运算符)吸收。导致我们无法再次输入一个运算符。
liu2002119 2021-04-14
  • 打赏
  • 举报
回复
引用 5 楼 qzjhjxj 的回复:
像你标题所说,因为循环输入,上一次的输入留在缓冲区里,第二次直接读取了。而后面的例子子,只是一次,虽然留在缓冲区,但代码执行到最后退出了,缓冲区的内容也释放掉了,下次再运行代码又是全新的空的。

缓冲区的内容在什么情况下才会释放掉呢?遇到printf也不会释放掉吗?
liu2002119 2021-04-14
  • 打赏
  • 举报
回复
引用 5 楼 qzjhjxj 的回复:
像你标题所说,因为循环输入,上一次的输入留在缓冲区里,第二次直接读取了。而后面的例子子,只是一次,虽然留在缓冲区,但代码执行到最后退出了,缓冲区的内容也释放掉了,下次再运行代码又是全新的空的。

scanf函数对于整形数据在读入时会过滤掉 空格符 、换行符 和 水平制表符。?
qzjhjxj 2021-04-14
  • 打赏
  • 举报
回复
像你标题所说,因为循环输入,上一次的输入留在缓冲区里,第二次直接读取了。而后面的例子子,只是一次,虽然留在缓冲区,但代码执行到最后退出了,缓冲区的内容也释放掉了,下次再运行代码又是全新的空的。
liu2002119 2021-04-14
  • 打赏
  • 举报
回复
引用 2 楼 自信男孩 的回复:
#include <stdio.h>

#define MIN 0
#define MAX 100

int main(void)
{
int number = (MIN + MAX) / 2;
char c = 'N';
int compare;

printf ("Let me guess the number.\n");
while (c != 'Y')
{
printf ("Is the number %d?Y or N?\n", number);
scanf ("%c", &c);
if (c == 'Y')
break; //number为所求值
if (c == 'N')
{
printf ("1) bigger 2)smaller\n Please choose 1 or 2!\n");
scanf ("%d", &compare);
getchar(); //for '\n'
if (compare == 1)
number = (number + MAX) / 2;
if (compare == 2)
number = (number + MIN) / 2;
}
}
printf ("So, the number is %d.\n", number);

return 0;
}

供参考~

加一条语句getchar();用于接收输入缓存里残留的'\n'。因为输入Y或N时回车会留在输入缓存里,而下次的scanf %c正好和'\n'匹配,导致把'\n'放到c变量里,而'\n'不是Y也不是N


#include <stdio.h>
int main (void)
{
int c1, c2, c3, c4;

scanf("%d", &c1);
scanf("%d", &c2);
printf ("%d, %d\n", c1, c2);

scanf("%d", &c3);
printf("%d\n", c3);
scanf("%d", &c4);
printf("%d\n", c4);

return 0;
}
liuxinjia119@liuxinjia119:~/program_exp$ ./scanf.out
12
12
12, 12
12
12
12
12

为什么这个scanf又不存在缓冲的问题呢?
liu2002119 2021-04-14
  • 打赏
  • 举报
回复
引用 1 楼 qzjhjxj 的回复:
供参考:
#include <stdio.h>
#define MIN 0
#define MAX 100
int main(void)
{
int number = (MIN + MAX) / 2;
char c = 'N';
int compare;

printf ("Let me guess the number.\n");
while (c != 'Y')
{
printf ("Is the number %d?Y or N?\n", number);
rewind(stdin);//清除标准输入的按键缓冲区
scanf ("%c", &c);
if (c == 'Y')
break; //number为所求值
if (c == 'N')
{
printf ("1) bigger 2)smaller\n Please choose 1 or 2!\n");
scanf ("%d", &compare);
if (compare == 1)
number = (number + MAX) / 2;
if (compare == 2)
number = (number + MIN) / 2;
}
}
printf ("So, the number is %d.\n", number);

return 0;
}


#include <stdio.h>
int main (void)
{
int c1, c2, c3, c4;

scanf("%d", &c1);
scanf("%d", &c2);
printf ("%d, %d\n", c1, c2);

scanf("%d", &c3);
printf("%d\n", c3);
scanf("%d", &c4);
printf("%d\n", c4);

return 0;
}
liuxinjia119@liuxinjia119:~/program_exp$ ./scanf.out
12
12
12, 12
12
12
12
12

为什么这个scanf又不存在缓冲的问题呢?
自信男孩 2021-04-07
  • 打赏
  • 举报
回复
#include <stdio.h>

#define MIN 0
#define MAX 100

int main(void)
{
int number = (MIN + MAX) / 2;
char c = 'N';
int compare;

printf ("Let me guess the number.\n");
while (c != 'Y')
{
printf ("Is the number %d?Y or N?\n", number);
scanf ("%c", &c);
if (c == 'Y')
break; //number为所求值
if (c == 'N')
{
printf ("1) bigger 2)smaller\n Please choose 1 or 2!\n");
scanf ("%d", &compare);
getchar(); //for '\n'
if (compare == 1)
number = (number + MAX) / 2;
if (compare == 2)
number = (number + MIN) / 2;
}
}
printf ("So, the number is %d.\n", number);

return 0;
}

供参考~

加一条语句getchar();用于接收输入缓存里残留的'\n'。因为输入Y或N时回车会留在输入缓存里,而下次的scanf %c正好和'\n'匹配,导致把'\n'放到c变量里,而'\n'不是Y也不是N
qzjhjxj 2021-04-06
  • 打赏
  • 举报
回复
供参考:
#include <stdio.h>
#define MIN 0
#define MAX 100
int main(void)
{
    int number = (MIN + MAX) / 2;
    char c = 'N';
    int compare;

    printf ("Let me guess the number.\n");
    while (c != 'Y')
    {
        printf ("Is the number %d?Y or N?\n", number);
        rewind(stdin);//清除标准输入的按键缓冲区
        scanf ("%c", &c);
        if (c == 'Y')
            break;         //number为所求值
        if (c == 'N')
        {
            printf ("1) bigger    2)smaller\n  Please choose 1 or 2!\n");
            scanf ("%d", &compare);
            if (compare == 1)
                number = (number + MAX) / 2;
            if (compare == 2)
                number = (number + MIN) / 2;
        }
    }
    printf ("So, the number is %d.\n", number);
    
    return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧