VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 884|回复: 7

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

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-19 20:30:01 | 显示全部楼层 |阅读模式
在《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这样的函数不需要再这样专门接收一下回车符?
  等待高手的解释,在这里先谢过了!
回复

使用道具 举报

0

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-5-10 12:30:02 | 显示全部楼层
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即空格键的十进制数

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

使用道具 举报

0

主题

18

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-5-14 17:30:02 | 显示全部楼层
如果你不要ENTER的话我们一般这样用
         int n1,n2;
        scanf("%d",&n1);
        getchar();
             ......
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-14 15:15:01 | 显示全部楼层
首先谢过楼上2位高手!

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

ch=getchar();

那么输入完字符之后还要敲回车,这个时候缓冲区里还有回车符么?为什么?
回复

使用道具 举报

0

主题

10

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-15 23:30:02 | 显示全部楼层
scanf,getchar都是如此,gets还是别拿出来用了吧
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-19 21:30:01 | 显示全部楼层
int n1,n2;
scanf("%d",&n1);
getchar();

嘿嘿 我是小虾米,我们老师告诉我们就这么用
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-7-29 18:15:01 | 显示全部楼层
汗楼上朋友的老师,为什么不用gets()啊?
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-29 18:45:01 | 显示全部楼层
当你有键盘输入的时候,IO 中断会处理你的输入,键盘驱动程序,会在键盘的内存缓冲
中存下你的按键,所以当你用Scanf后,第一个输入的数被传入到scanf的第2个参数的内存
中,此时键盘缓冲中还有一个回车,因此让你如果用getchar后,得到的字符是回车。
会了把这个回车过滤掉,需调用一次getchar把键盘缓冲清空。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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