用Scanf输入完字符串之后,为什么要处理一下后面的回车符?

AxUxlTl 2007-01-05 12:44:18
在谭浩强的《C程序设计第三版》里,在对fputc和fgetc两个函数进行应用举例的时候,用到下面一个例子:
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("Can't open file\n");
exit(0);
}
ch=getchar();/*此语句用来接收执行Scanf语句时最后输入的回车符*/
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
putchar(10);
fclose(fp);
}
其他的注释我都先省略掉了,我不明白为什么还要用这样一条语句接收这个回车。小弟才疏学浅,一直认为程序执行到某个地方等待用户的响应,回车符是让机子接收用户响应的一个标志,在这里怎么又成了一个字符了?如果它是一个字符,为什么在其他地方用scanf的时候没有多出这么一句?为什么像getchar这样的函数不需要再这样专门接收一下回车符?
  等待高手的解释,在这里先谢过了!
...全文
1245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-02-20
  • 打赏
  • 举报
回复
问问题的时候刚来CSDN,连结帖都不会,在这里谢谢大家了,祝大家春节愉快!
liu_yuntao520 2007-01-08
  • 打赏
  • 举报
回复
当你有键盘输入的时候,IO 中断会处理你的输入,键盘驱动程序,会在键盘的内存缓冲
中存下你的按键,所以当你用Scanf后,第一个输入的数被传入到scanf的第2个参数的内存
中,此时键盘缓冲中还有一个回车,因此让你如果用getchar后,得到的字符是回车。
会了把这个回车过滤掉,需调用一次getchar把键盘缓冲清空。
「已注销」 2007-01-08
  • 打赏
  • 举报
回复
汗楼上朋友的老师,为什么不用gets()啊?
Antony84 2007-01-07
  • 打赏
  • 举报
回复
int n1,n2;
scanf("%d",&n1);
getchar();

嘿嘿 我是小虾米,我们老师告诉我们就这么用
hustivan 2007-01-06
  • 打赏
  • 举报
回复
scanf,getchar都是如此,gets还是别拿出来用了吧
「已注销」 2007-01-06
  • 打赏
  • 举报
回复
首先谢过楼上2位高手!

  今天跟朋友讨论这个问题,他说那个回车符会存在键盘缓冲区里。我还有一点不明白,是只有scanf函数这样还是getchar()、gets()都会这样?举个例子,假如我有一条语句写成

ch=getchar();

那么输入完字符之后还要敲回车,这个时候缓冲区里还有回车符么?为什么?
ZOU_SEAFARER 2007-01-05
  • 打赏
  • 举报
回复
如果你不要ENTER的话我们一般这样用
int n1,n2;
scanf("%d",&n1);
getchar();
......
hustivan 2007-01-05
  • 打赏
  • 举报
回复
scanf()函数接受数据时,通常是以回车键作为结束一个数据的输入(空格键,tab键也行),给个例子你就明白了
#include <stdio.h>
int main()
{
int n1,n2;
scanf("%d",&n1);
n2=getchar();
printf("n1=%d,n2=%d",n1,n2);
}
录入时请输入12和Enter,其中n2=10,10即'\n'的十进制数
若录入时输入12和space和Enter,其中n2=32。32即空格键的十进制数

书中例子是按一般情况处理

69,371

社区成员

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

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