stdio.h头文件(常用输入输出函数)
stdio.h头文件(常用输入输出函数)
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。
getchar()
函数:
读取下一个输入字符
- 使用int数组时
getchar
只能赋值数字,无法赋值其他字符容易出错。 - getchar()和 putchar()不需要转换说明,因为它们只处理字符。
- 在C语言中,用
getchar()
读取文件检测到文件结尾时将返回EOF
。 - 把
getchar()
的返回值和EOF
作比较。如果两值不同,就说明没有到达文件结尾。- 检测文件结尾:
while ((ch = getchar()) != EOF)
- 检测文件结尾:
- 不能把
getchar()
和scanf()
这两个函数混用getchar()
读取每个字符,包括空格、制表符和换行符;scanf()
在读取数字时则会跳过空格、制表符和换行符- 以 int 类型读取字符(这样做可以检测 EOF)
putchar()
函数:
打印一个字符
gets()
函数:
读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符的末尾添加一个空字符使其成为一个 C字符串。
- 经典用法:
gets(words);
- words是一个char型数组。如果输入的字符串过长,会导致缓冲区溢出,可能出现问题。
- 过去通常用fgets()来代替gets(),其在处理输入方面与gets()略有不同。
- C11标准新增的gets_s()函数也可代替gets()。该函数与gets()函数更接近,而且可以替换现有代码中的gets()。但它是stdio.h输入/输出函数系列中的可选扩展。
puts()
函数:
只用于显示字符串,而且自动在显示的字符串末尾加上换行符。
- 该函数在遇到空字符时就停止输出,所以必须确保有空字符。
fgets(,,)
函数:
- 第1个参数是数组,
- 第2个参数指明了读入字符的最大数量。通过限制读入的字符数来解决溢出的问题。该函数专门设计用于处理文件输入。
- 如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止。
- 如果fgets()读到一个换行符,会把它储存在字符串中。
- fgets()函数的第3 个参数指明要读入的文件。
- 如果读入从键盘输入的数据,则以
stdin(标准输入)
作为参数- 该标识符定义在stdio.h中。
- 如果读入从键盘输入的数据,则以
- fgets()函数把换行符放在字符串的末尾,通常要与 fputs()函数配对使用,除非该函数不在字符串末尾添加换行符。
- 使用循环语句fgets()读不到换行会一直读,直到读完一整行,这样可以某种程度上无视数组大小的限制。
- 示例:
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
- 示例:
fputs(,)
函数:
是puts()针对文件定制的版本。
- 第2个参数指明要写入数据的文件。如果要打印在显示器上,
stdout(标准输出)
作为该参数 - 不在字符串末尾添加换行符。
- 注意,gets()丢弃输入中的换行符,但是
puts()
在输出中添加换行符。 - 另一方面,
fgets()
保留输入中的换行符,fputs()
不在输出中添加换行符。 - 使用示例:
fputs(words, stdout);
- 注意,gets()丢弃输入中的换行符,但是
gets_s()
函数:
和fgets()
类似,都用一个参数限制读入的字符数。
- gets_s()只从标准输入中读取数据,所以不需要第3个参数。
- 如果gets_s()读到换行符,会丢弃它而不是储存它。
- 如果gets_s()读到最大字符数都没有读到换行符,首先会把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。
- 而fgets()会将它们保留在输入行。只要输入行未超过最大字符数,gets_s()和gets()几乎一样,完全可以用gets_s()替换gets()。