使用scanf()
- C库包含了多个输入函数,scanf()是最通用的一个,因为它可以读取不同格式的数据。从键盘输入的都是文本,scanf()把输入的字符串转换成整数、浮点数、字符或字符串
scanf()中的格式字符串表明字符输入流的目标数据类型,使用指向变量的指针
- 读取基本变量类型的值,在变量名前加上一个&
- 把字符串读入字符数组中,不要用&
- scanf()函数使用空白(换行符、制表符和空格)把输入分成多段。在依次把转换说明和字段匹配时跳过空白。唯一例外的是%c转换说明,根据%c,scanf()会读取每个字符,包括空白
- scanf()函数所用的转换说明与printf()函数几乎相同。主要的区别是,对于float和double类型,printf()都使用%f、%e和%g转换说明,而scanf()函数只把它们用于float类型,对于double类型都要使用l修饰符
scanf()转换说明中(百分号和转换字符之间)的修饰符
- * | 抑制赋值
- 数字 | 最大字段宽度。输入达到最大字段宽度处,或第一次遇到空白字符时停止
- hh | 把整数作为signed char 或 unsigned char 类型读取。
- ll | 把整数作为long long 或 unsigned long long 类型读取
- h、l或L | 在e、f和g前面使用大写L而不是l,表明把对应的值存储为long double类型
- J
- z | 在整型转换说明前面时,表明使用sizeof的返回类型
- t | 表明使用表示两个指针差的值
从scanf()角度看输入
- scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第一个非空白字符时才开始读取
- 如果使用字段宽度,scanf()会在字段结尾或第一个空白字符处停止输入
对于%d转换说明
- scanf()不断地读取和保存字符,直至遇到非数字字符,它便认为读到了整数的末尾。然后scanf()把非数字字符放回输入,这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的字符
- 如果第一个非空白字符是字符而不是数字,scanf()会停在那里,并把A放回输入中。如果程序只使用%d转换说明,scanf()就一直无法越过A读下一个字符,如果使用带多个转换说明的scanf(),C规定在第一个出错处停止读取输入
- 如果使用%s转换说明,scanf()会读取空白以外的所有字符。无法利用一个%s的scanf()读取多个单词。最后要注意一点,当scanf()把字符串放进指定数组中时,它会在字符序列末尾加上'\0'(空字符),让数组中的内容成为一个C字符串
格式字符串中的普通字符
- scanf()允许把普通字符放在格式字符串中。除空格外的普通字符必须与输入字符串严格匹配
- 除了%c,其他转换说明都会自动跳过待输入值前面的所有空白。对于%c,在格式字符串中添加一个空格会有所不同,如果在格式字符串中把空格放到%c的前面,scanf()便会跳过空格,从第一个非空白字符开始读取。如果%c前面没有空白,则之间读取任意一个字符(包括空白)
scanf()的返回值
- scanf()函数返回成功读取的项数,如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0
printf()和scanf()的*修饰符
- printf()和scanf()都可以使用*修饰符来修改转换说明的含义,但是它们的用法不太一样
printf()中
- width参数提供字段宽度
- precision提供精度
- scanf()中,把*放在%和转换字符之间,会使得scanf()跳过相应的输入项
printf()的用法提示
- 使用足够大的固定字段宽度可以让输出整齐美观
- 在两个转换说明中间插入一个空白字符,可以确保即使一个数字溢出了自己的字段,下一个数字也不会紧跟着该数字一起输出
- 本地化设置
最后修改:2024 年 03 月 07 日
© 允许规范转载