常用输入输出函数
printf()
:把输出发送到一个叫作缓冲区(buffer)的中间存储区域。- 当缓冲区满、遇到换行字符或需要输入的时候迫使
printf()
的输出被发送到屏幕上。 - 可以使用
fflush()
函数刷新缓冲区 printf()
的返回值是待显示字符的个数printf()
中如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用*修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。也就是说,如果转换说明是%*d
,那么参数列表中应包含*和 d对应的值。这个技巧也可用于浮点值指定精度和字段宽度。(%*.*f
)
- 当缓冲区满、遇到换行字符或需要输入的时候迫使
scanf()
:scanf()函数每次读取都会跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。- 读取整数(%d):
scanf()
希望发现一个数字字符或者一个符号(+或-)。如果遇到一个非数字字符,它便认为读到了整数的末尾。scanf()
把非数字字符放回输入。意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。 - 读取字符(%c):读取单个字符
- 读取字符串(%s):
scanf()
会读取除空白以外的所有字符。意味着只能读取一个单词。- 无法利用字段宽度让只有一个%s的
scanf()
读取多个单词。如果使用字段宽度,scanf()
在字段末尾或第1个空白字符处停止读取。
- 无法利用字段宽度让只有一个%s的
- 格式字符串中的普通字符:
scanf()
允许把普通字符放在格式字符串中。但除空格字符外的普通字符必须与输入字符串严格匹配。- 假设在两个转换说明中加一个逗号:
scanf("%d,%d", &n, &m);``scanf()
函数将其解释成:用户将输入一个数字、一个逗号,然后再输入一个数字。也就是说,用户必须像下面这样进行输入两个整数:- 由于格式字符串中,%d后面紧跟逗号,所以必须在输入第一个数后再输入一个逗号。
- 假设在两个转换说明中加一个逗号:
- 对于
scanf()
,一定要记得在变量名前加上地址运算符。 scanf()
的返回值=scanf()
成功读取的项数。如果没有读取任何项,或者需要读取一个数字而用户却输入一个非数值字符串,即类型不匹配,scanf()
便返回0。- 当
scanf()
检测到“文件结尾”时,会返回EOF
(EOF是stdio.h中定义的特殊值,通常用#define
指令把EOF定义为-1
)。 scanf()
中如果把*放在%和转换字符之间时,会使得scanf()
跳过相应的输出项。- 示例:
scanf("%*d %*d %d", &n);
其中的scanf()
指示:跳过两个整数,把第3个整数拷贝给n。 - 在程序需要读取文件中特定列的内容时,这项跳过功能很有用。
- 示例:
scanf()
函数检测到文件结尾时返回EOF。
- 读取整数(%d):
getchar()
:读取下一个输入字符- 使用int数组时
getchar
只能赋值数字,无法赋值其他字符容易出错。 - getchar()和 putchar()不需要转换说明,因为它们只处理字符。
- 在C语言中,用
getchar()
读取文件检测到文件结尾时将返回EOF
。 - 把
getchar()
的返回值和EOF
作比较。如果两值不同,就说明没有到达文件结尾。- 检测文件结尾:
while ((ch = getchar()) != EOF)
- 检测文件结尾:
- 不能把
getchar()
和scanf()
这两个函数混用getchar()
读取每个字符,包括空格、制表符和换行符;scanf()
在读取数字时则会跳过空格、制表符和换行符
以 int 类型读取字符(这样做可以检测 EOF)
- 使用int数组时
putchar()
:打印一个字符