新手使用scanf()最最最最容易遇到的问题,根据自己的经历做点总结

  • scanf(" 格式串",内存地址);
  • 空白字符:"空格",换行(\n),回车(\r),水平制表(\t),垂直制表(\v),换页(\f).
  • scanf()输入常见有两种形式 , 一种是文本输入,一种是二进制输入

    这里主要是二进制输入 而且用VS  是再Window操作系统下,其他系统不知道。

由于scanf()输入结束时,会按回车把一个换行也输入缓冲区,导致下一次输入时,不知道换行到哪里去了。

分以下几种情况 (不同的%d 我用不同的颜色标记)

首先知道格式串 往对应的内存地址里面输入内容,但是会先保存在缓冲区。

scanf() 输入时会跳过空白字符。比如

  •  scanf("  %d%d");

格式流为"  %d%d

 先在键盘上输入几个空格 ,这几个空格是空白字符,不会写入%d,再输入12,遇到第一位非空白字符 1 才开始写入%d,把2写完了以后,再按回车(空白字符)或者空格,这些是空白字符表示第一次输入%d 结束,如果再接着按任意次空格或者回车 都不会影响%d 的内容,直到输入23 ,第二次遇到非空白字符23才向%d输入内容,输入完23后再按回车(表示输入了一个换行),scanf执行完了。

  •  scanf("%d  %d")

 格式流为(%d (空格)%d)。还是如果先输入空白字符不会输入进%d 遇到非空白字符才会输入。再遇到空白字符表示%d输入结束。就这样输入完23 回车(这个回车会放在缓冲区)后才会执行printf。

  • scanf("%d%d   '');

格式串是(“%d%d   ”) 遇到第一个非空白数据12,再第二次遇到非空数据23  回车后,不会执行printf,因为%d后面还有空格,就表示输入流还没结束,只有再次输入2或者任意非空白数据后就结束了,执行printf。其实格式串里面的输入流 要以最后一次为非空白数据 才表示结束,例如

这次%d后面是非空白数据  **  ,输入完23后按回车就执行printf。

总之,格式串要遇到非空白数据才开是输入 ,最后格式串也一定要以非空白数据结尾才会结束scanf函数。

输入单个字符和输入数据是不一样的。

  • scanf("%c%c); 

这种要注意 %c是输入单个字符的格式串,键盘上的回也是字符(空白字符),当输入a时再按回车 时 就把a输入进%c, 把键盘上的回车输入进了%c,接着就scanf()就执行完了。  

  • scanf("%c%c   ");

   %c读取a %c 读取换行 ,这%c 后面有空格(空白字符) 则scanf()函数不会结束,直到下一次遇到3(非空白字符)。 这是我经常出的错误。

  • scanf("%d%c")

 %d 输入97 按回车后,就会把回车输进%c  

  • scanf("%s%c");

即使输入字符串%s也是和 %d 一样 按回车后会把回车输进%c  

我之前经常犯错 是这种情况

int main(){
 char a;
 char b;
scanf("%c",&a);
scanf("%c",&b);

}

给内存地址a输入字符后 按回车,会把回车放再缓冲区 等执行下一次scanf()时 会把回车输入给b。

 为了避免这种情况,可以用 getchar()函数 , 这样输入完后 会执行 getchar()函数 自动把缓冲的回车给 getchar()函数。

 

int main(){
 char a;
 char b;
scanf("%c",&a);
getchar();
scanf("%c",&b);

}

总之,千万千万要切记 键盘上的回车也是字符 , 键盘上的回车和  \n 不是一个东西,还有在不同的操作系统上 对于缓冲区的回车处理不一样 。 以上是二进制的输入,从文本里面输入 又不一样。但是用std::cin>> 输入时不会把表示结束的回车键也输入进去 ,从底层来看这样效率也会慢些。

谢谢大家的浏览,祝愿你我都越来越好。本人微信 jyt15115502113 也可以加个微信做朋友。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值