printf与scanf的执行顺序问题

projoy 2008-07-07 11:27:05
#include <stdio.h>
int side (int x);
char character(char t);
int main ()
{
int n;
char c;
printf("the number is :\n");
scanf("%d",&n);
printf("the char is:");//为什么执行程序时这两步没有
scanf("%c",&c);//作用?即没有打出the char is:和让我输入字符的过程
side(n);
character(c);
}
int side (int x){
int i=0,j;
for(i=0;i<x;i++){
for(j=0;j<x;j++){
printf("*");
}
printf("\n");
}
}
char character(char t)
{
printf("%c",t);
}

...全文
1408 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyuqian 2008-07-12
  • 打赏
  • 举报
回复
可以在%c前面空一格
scanf(" %c",&c);
lunarfan 2008-07-11
  • 打赏
  • 举报
回复
printf("the number is :\n");
scanf("%d",&n);
因为前面要求你先输入个整型数
projoy 2008-07-11
  • 打赏
  • 举报
回复
恩,我的是在gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)下,输入fflush(stdin)后还是一样的不可以,输入getchar().可以,谢谢
烂泥 2008-07-08
  • 打赏
  • 举报
回复
先执行
printf("the number is :\n");
等你输入了再执行
printf("the char is:");
weiyijiji 2008-07-08
  • 打赏
  • 举报
回复
printf()仍然执行的.fflush(stdin)可能在有些平台不支持,如果是刷新单个字符,建议用
getchar().
Darkneece 2008-07-08
  • 打赏
  • 举报
回复
奇怪,我用VC6没发现LZ所说的情况
Michael_555 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 projoy 的回复:]
谢谢你了,问题解决了,可是我还是很疑惑,为什么第一个scanf的回车会被第二次的scanf吃掉。而且是越过了第二个printf,应该时先printf运行才对嘛?
[/Quote]

第二个printf运行了,只是你没有看到而已,不信你可以在side(n)的位置设个断点看看。

因为第一次scanf的时候,你输入了数字和回车键,数字从输入缓冲中取出赋给了n,但是回车键仍然留在输入缓冲中,所以第二次运行scanf的时候,看到输入缓冲中有回车键,会误以为你已经输入好了。
  • 打赏
  • 举报
回复
    printf("the number is :\n");
scanf("%d",&n); /* 输入是以回车结束的 */
printf("the char is:");//为什么执行程序时这两步没有

fflush(stdin);
/* 接收一个字符,而如果不加fflush(stdin);清空缓存的话,此处接收的就是上一个scanf的回车符 */
scanf("%c",&c);//作用?即没有打出the char is:和让我输入字符的过程
side(n);

so,建议改成下面这样:

printf("the number is :\n");
scanf("%d",&n);
printf("the char is:");

fflush(stdin);
scanf("%c",&c);
side(n);


Jerrylearnc 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 projoy 的回复:]
谢谢你了,问题解决了,可是我还是很疑惑,为什么第一个scanf的回车会被第二次的scanf吃掉。而且是越过了第二个printf,应该时先printf运行才对嘛?
[/Quote]

是啊

为什么第一个scanf的回车会被第二次的scanf吃掉。而且是越过了第二个printf,应该时先printf运行才对嘛?

我原来也遇到这种情况 我用的是fflush(stdin);来刷新缓冲区的。
jy01807853 2008-07-08
  • 打赏
  • 举报
回复

printf("the number is :\n");
scanf("%d",&n);
其实你在它的后面在一条语句就可以解决了
fflush(stdin); 加这就可以了,刷新缓冲区
因为你第一次读了字符按了回车, 输入流遇到结束符号
第2次你在想用同一个输入流不太可能吧兄弟, 所以要
清理输入流使它重新恢复成有效!!!!!!!!!

我的言论如果有错希望楼下指正
projoy 2008-07-08
  • 打赏
  • 举报
回复
谢谢你了,问题解决了,可是我还是很疑惑,为什么第一个scanf的回车会被第二次的scanf吃掉。而且是越过了第二个printf,应该时先printf运行才对嘛?
Michael_555 2008-07-07
  • 打赏
  • 举报
回复
按照你调用的顺序执行,你所出现的问题是因为scanf("%d",&n)之后,没有清除回车键,下面的scanf("%c",&c)就误以为这个回车键就是输入,直接跑过去了


#include <stdio.h>
int side (int x);
char character(char t);
int main ()
{
int n;
char c;
printf("the number is :\n");
scanf("%d",&n);
getchar();//清除上面输入的回车键
printf("the char is:");//为什么执行程序时这两步没有
scanf("%c",&c);//作用?即没有打出the char is:和让我输入字符的过程
side(n);
character(c);
}
int side (int x){
int i=0,j;
for(i=0;i<x;i++){
for(j=0;j<x;j++){
printf("*");
}
printf("\n");
}
}
char character(char t)
{
printf("%c",t);
}

70,038

社区成员

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

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