1、scanf()函数把输入的字符串转换成各种形式:整数、浮点数、字符和C的字符串。
2、printf()把%f、%e、%E、%g、%G同时用于float类型和double类型,而scanf()只把他们用于float类型,而用于double类型时要求使用l修饰符。
3、scanf()的转换说明符
转换说明符 | 意义 |
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e、%f、%g、%a | 把输入解释成一个浮点数 |
%E、%F、%G、%A | 把输入解释成一个浮点数 |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号八进制整数 |
%p | 把输入解释成一个指针(一个地址) |
%s | 把输入解释成一个字符串;输入内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符。 |
%u | 把输入解释成一个无符号十进制整数 |
%x、%X | 把输入解释成一个有符号十六进制整数 |
4、scanf()转换修饰符
修饰符 | 意义 |
* | 滞后赋值 |
digit(s) | 最大字段宽度;在达到最大字段宽度或者遇到第一个空白字符时(无优先原则)停止对输入项的读取 |
hh | 把整数读作signed char或unsigned char |
ll | 把整数读作long long或者unsigned long long |
h,l或L | %hd,%hi -- 存储在short int中 |
5、scanf()读取原理:
假设使用%d来读取一个整数。scanf()跳过空白字符(空格、制表符和换行符)直到遇到非空白字符。因为他试图读取一个整数,所以他发现一个数字字符或者一个符号。一直连续读取并保存,直到遇到一个非数字的字符,遇到后则定位读取到了整数的尾部。scanf()把这个非数字字符放回输入,这意味着当程序下一次开始读取输入时,将从前面被放弃的那个非数字字符开始读取。
如果使用了字符宽度,那么scanf()在字段结尾或者在第一个空白字符处(二者先到达的一个)终止。
如果第一个非空白字符不是数字,则scanf()会停在,不会赋给指定的变量。
如果使用%s说明符,那么空白字符意外的所有字符都是可以接受的,如果指定存储到一个数组中,则会自动的加入结尾符。
如果使用%c说明符,那么所有的输入字符都是平等的,不会跳过空白符或者换行符。
6、用户输入需要与要求输入的格式相同。如scanf("%d,%d",&a,&b),则在输入时必须加入逗号。
7、除了%c以外的说明符会自动跳过输入项之前的空格,即scanf("%d",&n)与scanf(" %d",&n)是相同的,而scanf("%c",&ch)读取在输入中遇到的第一个字符,而scanf(" %c",&ch)则会读取遇到的第一个非空白字符。
eg:读取 -13.45e12# 0(第一个是空格)
%d -- -13
%f -- -13.45e12
%s -- -13.45e12#
%c -- (空格符)
8、scanf()函数返回成功读入的项目个数,当未读到内容时,返回0,检测到“文件结尾时”,返回EOF(end of file)。