求解C一个关于scanf拿不拿到值得问题

Snowdrop 2016-04-27 11:25:08
#include <stdio.h>
int main()
{
int sum = 0, num = 0;
char end = 0;
while ( end != 'q' )
{
scanf( "%d", &num ) ;

sum += num;

scanf( "%c", &end ) ;
num=0;
}
printf( "%d \n", sum );
return 0;
}
/*
先输入1,num拿到1,然后累加,sum拿到1,之后我输个9,按理应该是end拿到字符9,但是结果为10,它把9加上去了,貌似跳过了scanf,不解,求解惑。
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
AfricanCu 2016-04-29
  • 打赏
  • 举报
回复
我刷新输入缓冲区
flying_music 2016-04-28
  • 打赏
  • 举报
回复
引用 8 楼 louis_green 的回复:
[quote=引用 5 楼 cyfcsd 的回复:] [quote=引用 2 楼 louis_green 的回复:] [quote=引用 1 楼 cyfcsd 的回复:] scanf( "%c", &end ) ;把回车接收了, 把这句话写两次就可以了 第一次节回车,第二次接你的输入
按你这么做,先给1,num拿1,第一个scanf拿回车,再输9,是第二个scanf拿9,还是,头一个scanf(num语句下面的)拿9?[/quote] 中间都要有两回车,如果只想要一个 scanf( "%c", &end ) ;,输入之间用空格隔开[/quote] 不行唉,中间都要俩回车,程序运行直接是一直输入的状态,输入啥也结束不了,包括q,也不行。[/quote] 不会吧,要退出的话第一个是回车第二是q
Snowdrop 2016-04-27
  • 打赏
  • 举报
回复
引用 5 楼 cyfcsd 的回复:
[quote=引用 2 楼 louis_green 的回复:] [quote=引用 1 楼 cyfcsd 的回复:] scanf( "%c", &end ) ;把回车接收了, 把这句话写两次就可以了 第一次节回车,第二次接你的输入
按你这么做,先给1,num拿1,第一个scanf拿回车,再输9,是第二个scanf拿9,还是,头一个scanf(num语句下面的)拿9?[/quote] 中间都要有两回车,如果只想要一个 scanf( "%c", &end ) ;,输入之间用空格隔开[/quote] 不行唉,中间都要俩回车,程序运行直接是一直输入的状态,输入啥也结束不了,包括q,也不行。
小灸舞 版主 2016-04-27
  • 打赏
  • 举报
回复
当楼主某次输入q的时候,是 scanf( "%d", &num ) ;先读取的,但由于类型无法匹配,所以读取失败,楼主可以通过scanf返回值得知此次读取失败了,输入缓冲区还是q\n 然后就执行到了scanf( "%c", &end ) ;end成功读取了q字符,之后while ( end != 'q' ) 跳出循环
Snowdrop 2016-04-27
  • 打赏
  • 举报
回复
引用 4 楼 qq423399099 的回复:
你输入9,输入缓冲区是9\n,然后scanf( "%d", &num ) ;读走9,输入缓冲区还遗留下\n 然后scanf( "%c", &end ) ;会直接读取掉回车而不需要等待用户输入(此时输入缓冲区为空了) 然后又跳到while ( end != 'q' )判断,之后是 scanf( "%d", &num )
谢谢,你讲的很清楚,那如果接下来我希望程序结束,输入q,那这个q是转化为对应的ascii码整型数113给了num,还是跳过第一个scanf,直接给了字符型的end?
flying_music 2016-04-27
  • 打赏
  • 举报
回复
引用 2 楼 louis_green 的回复:
[quote=引用 1 楼 cyfcsd 的回复:] scanf( "%c", &end ) ;把回车接收了, 把这句话写两次就可以了 第一次节回车,第二次接你的输入
按你这么做,先给1,num拿1,第一个scanf拿回车,再输9,是第二个scanf拿9,还是,头一个scanf(num语句下面的)拿9?[/quote] 中间都要有两回车,如果只想要一个 scanf( "%c", &end ) ;,输入之间用空格隔开
Snowdrop 2016-04-27
  • 打赏
  • 举报
回复
引用 1 楼 cyfcsd 的回复:
scanf( "%c", &end ) ;把回车接收了, 把这句话写两次就可以了 第一次节回车,第二次接你的输入
按你这么做,先给1,num拿1,第一个scanf拿回车,再输9,是第二个scanf拿9,还是,头一个scanf(num语句下面的)拿9?
小灸舞 版主 2016-04-27
  • 打赏
  • 举报
回复
你输入9,输入缓冲区是9\n,然后scanf( "%d", &num ) ;读走9,输入缓冲区还遗留下\n 然后scanf( "%c", &end ) ;会直接读取掉回车而不需要等待用户输入(此时输入缓冲区为空了) 然后又跳到while ( end != 'q' )判断,之后是 scanf( "%d", &num )
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
flying_music 2016-04-27
  • 打赏
  • 举报
回复
scanf( "%c", &end ) ;把回车接收了, 把这句话写两次就可以了 第一次节回车,第二次接你的输入
Snowdrop 2016-04-27
  • 打赏
  • 举报
回复
引用 7 楼 qq423399099 的回复:
当楼主某次输入q的时候,是 scanf( "%d", &num ) ;先读取的,但由于类型无法匹配,所以读取失败,楼主可以通过scanf返回值得知此次读取失败了,输入缓冲区还是q\n 然后就执行到了scanf( "%c", &end ) ;end成功读取了q字符,之后while ( end != 'q' ) 跳出循环
谢谢舞哥,用scanf的返回值一检查,果然了然,果断关注!
Snowdrop 2016-04-27
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];
大神这一席话,我将受用终身!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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