C语言——scanf()函数的具体详解

目录

一、两种用法

二、从scanf角度看输入

 三、格式字符串中的普通字符


一、两种用法

1.使用scanf()读取基本变量类型输入:scanf("%d",%a);

2.使用scanf()读取字符数组:scanf("%c",a[2]);

其实很好理解,使用scanf读取输入需要确定变量值的地址,因此读取基本类型输入的时候需要使用取地址符,而对于字符数组,它的首元素地址就是这个数组的地址,因此并不需要加取地址符号

说到底,scanf的参数列表是使用指向变量的指针 ,所以才涉及到变量值的地址的问题。

二、从scanf角度看输入

1.scanf的处理机制

scanf以删除的方式从缓冲区读入数据(来自标准输入设备的数据存储在缓冲区),也就是说,scanf从缓冲区读入一个数据项,该数据项在缓冲区中就被清除掉了。而如果scanf需要读取一个数据项,发现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待用户输入,scanf函数接收到相应的数据项之后,在缓冲区中将这一数据项清除,scanf函数返回,程序继续执行。

2、scanf对不同类型输入的处理方式

希望读者记住scanf函数在读取除字符之外的输入的时候会遵守以下原则

scanf函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个空白字符的时候才开始读取。

  1.整数%d

对于整型数据的输入,也就是说"%d"类型的输入,scanf默认的分割符是所有的空白字符(空格,回车和制表符都行)。也就是说如果一个scanf函数中出现scanf("%d%d",&a,&b),那么用任何一个空白字符来分隔两个整数a,b的值,变量a,b都可以接收到正确的输入。

因此对于

scanf("%d %d",&a,&b);

使用以下格式输入都是没有问题的

7    3

-》》》7 3

7

3

-》》》7 3

7        3

-》》》7 3 

 输入队列中的7和3以及中间的空格,制表符或者换行符都会被送入缓冲区,但是scanf只接受非空白字符,因此无论以上三种格式输入都不会改变输入结果,理由是scanf会跳过所有的空白字符,将其丢在缓冲区内。所以,程序在下一次读取输入的时候会首先读取到的是被丢弃在缓冲区中的空白字符,如果接下来的转换说明是%c,或者%s,将会直接读取该空白字符而不是跳过,空白字符会从打印队列中显示出来。

#include <stdio.h>
void main()
{
int a;
char c;
char b[5];
scanf("%d%c",&a,&c);
printf("a=%d c=%c",a,c);

}

 -》5          //这里的输入是5然后按下enter键

-》》》》a=5 c=

                                                                                     //这里多出来的空白一行就是输入的\n
--------------------------------
Process exited after 1.162 seconds with return value 7
请按任意键继续. . .

这里就是因为5后面的enter键被读取到c里去了,所以按下enter后还未开始输入c就已经打印了输出结果 

2.字符串%s

如果使用%s转换说明,scanf会读取除了空白以外的所有字符。

scanf在读取字符串时,在遇到第一个空白的时候会停止不再读取输入。第一个空白字符后的所有字符都会被保留在缓冲区中,直到缓冲区被刷新或者被scanf读取走。

3.字符%c

scanf在处理对字符数据的输入时,既不会忽略前导空白字符,默认也没有任何分隔字符。所有的字符,包括空白字符都会被当成输入字符.

因此如果在读取字符输入的时候一定要谨慎使用空白字符(空格、制表、换行)。

 三、格式字符串中的普通字符

这里需要明确一点

输入项和输出项的个数、顺序和类型都要与格式控制符的个数、顺序、类型严格一致

例如

scanf("%d,%d",&n,&m);

这里必须要

-》 88,121

这样按照格式化字符串里的要求:数据——逗号——数据

去输入。

由于%d会跳过所有的空白字符

所以以下的输入方式都是正确的

-》88,    121

-》88,

121

-》88  ,  121 

需要注意的是%c不会忽略空白字符

所以一旦使用%c的格式化字符串要求输入的时候

scanf("%c%c",&a,&b); 

当格式化字符串是这样要求的时候

必须按照

-》ab

的形式输入,两个字符中间不能有任何的分割符(空白字符)

因为输入的空白字符会被当做字符输出

而若格式化字符串是这样的时候

scanf("%c %c",&a,&b);

这样我们正常输入就可以了,因为我们不管是输入

-》a b

-》a

b

-》ab

 都会正常输出

这是因为%c %c中间的这个空格(或者tab键输入的制表符,或者换行符),都是用来屏蔽空白符的。%c前没空格,scanf()将读取缓冲区中的第一个字符,%c前有空格,scanf()则读取缓冲区中第一个非空白字符。

这同样对%d以及其他格式化输入适用

在scanf中 格式字符串中出现的空白符不是表示接受一个空白符,而是表示忽略所有的空白字符(包括回车,空格,tab )。所以想要结束输入,输入任意一个非空白字符即可,但是该字符仍然会留在缓冲区中。

猜你喜欢

转载自blog.csdn.net/LYY_WJL/article/details/127825447
今日推荐