scanf的输入问题与解决办法

写作想法来源是我的朋友问我的scanf问题以及自己在写学校上机报告时也遇到了这个问题,就想拿出来分享一下

问题:

看下面这个例子

当我输入abc回车时,期望接下来的是"请输入待查找的字符 ch:"这一段文字,然而结果却是这样

于是我就进行了调试

s中存的确实是我想要的结果,而ch中存的却是'\n',这是为什么呢?

scanf的使用:

回答这个问题之前,我们先来看看scanf函数的使用

int scanf ( const char * format, ... );

参数部分:格式形式+地址

1、格式形式

%d %u %s %c %o %x %f等

2、地址

如果要存储常规变量(非指针),其名称应以引用运算符 (&) 开头,如果是地址则不用。

3、输入方式要求

从键盘上输入的内容要与scanf双引号里的格式形式包括变量类型要一一对应。

4、空白字符

空格,换行符(\n),制表符(\t,\v)

5、scanf的读取

当scanf遇到空白字符会自动跳过(除%c,其会存入),直到遇到与格式形式对应的数据内容时开始读取,当遇到非此格式的内容时则停止读取。如果格式与数据内容不相符时,就会读取错误。字符串(%s)当遇到\0时会停止读取,并以\0结尾。

返回值

成功后,该函数返回已成功填充的项数。未读取到则返回0。

而且,如果在成功读取任何数据之前发生读取错误或达到文件末尾,则返回 EOF

一般用于循环

int n = 0;
while(scanf("%d",&n)!=EOF)
{
    ;
}

问题分析

说完用法,我们接着再来看前文的问题

我们键盘输入的是abc (enter),缓存区存入的则是a b c \n,字符串s遇到字符a开始存入,当遇到\n时停止,因此abc存入到字符串s中,而缓存区此时还有\n的存在,刚好下一个我要输入一个字符,因此\n直接就被存到ch里了,因此没有达到想要的结果。

那如何解决这个问题呢?

解决方法

方法一:

我们可以在%c前加上一个空格,用空格将\n给跳过,这样我们就能继续往下输入字符了。

方法二:

我们可以使用gets()或fgets()函数来输入字符串,避免出现缓存区还有其他字符出现被读取到下一个scanf中。

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值