- 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 也可以加个微信做朋友。