2026/07/28 C语言的输入和输出
一、C语言的输出
1.格式化输出
一般标准C库中提供了很多关于输出的函数接口,其中最常用的就是printf()函数。printf()函数将输入内容写入标准输出流stdout (the standard output stream),printf函数的返回值是被输出的字符的数量(不包含\0),当输出错误时返回一个负整数。
printf输出的是字符串,只不过字符串有格式,普通字符会原封不动地输出到标准输出,%后面可以有0个或者多个转换标志,最小字段宽度(可选),精度(可选),长度修饰符(可选)来修饰普通字符。
(1)转换标志字符
转换标志字符必须放在%的后面。
'#'可以把对应进制的前导符进行输出 : ‘#o’可以把8进制的前导符输出 '#x'则可以把十六进制的前导符输出。
'-'可以用于进行数据对齐 ,-表示左对齐,默认为右对齐,一般结合字段宽度使用。
(2)字段宽度
指的是待输出的字符串需要占用多少列 ,使用十进制数指定。
(3)转换修饰符
用于指定转换类型
d:以有符号的十进制数输出整形数
o u x(X):把无符号的整形转换为八进制,十进制,十六进制输出
e:先四舍五入,再以科学计数法的格式输出。小数点前固定保留1位数字,小数点后的数字位数等于设定的精度值。若未手动指定精度,默认精度为6,若精度设为0,则输出时不显示小数点。
c:传入的int类型参数会先转换为unsigned char.得到的单个字符直接输出打印(对应ASCII码表)
s:%s期望传入const char *类型参数,即普通单字节字符串指针读取数组内字符进行输出,直到\0。若指定精度,则最多输出指定个数的字符,此时末尾可以不带\0。
p:必须传入指针,并把指针以十六进制形式输出
若要输出真正的百分号%,使用%%代替。
(4)转换精度
用英文句号.表示,其后面跟着一个可选的十进制数。
若只有.则表示精度为0。
(5)长度修饰
hh h l ll
hh把整形转为字符型,只是针对输出内容而言,数据本身没有受到影响。
h把整形转为短整型,只是针对输出内容而言,数据本身没有受到影响。
(6)转义字符
在利用printf函数输出字符串时,用户可能需要输出一些转义字符 ‘\n’以及’\t’是比较常用的。
注意有的时候是需要把一些特殊字符当做普通字符输出,比较 “ ” ,可以使用 \” 和 \” 输出。
(7)返回结果
printf 函数调用成功则返回打印的字符个数(不包括 \0)。
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("%x\n",100); //转为16进制并直接输出
printf("%#x\n",100); //转为16进制并把前导符0x输出
printf("%#o\n",100); //转为8进制并把前导符0输出
printf("%-10d %d\n",100,200); //100左对齐,字段宽度为10
printf("%f\n",3.14); //不指定精度,则默认精度为6位
printf("%.f\n",3.14); //指定精度,但不指定位数,则默认精度为0位
printf("%.2f\n",3.14159); //指定精度,指定位数,会进行四舍五入、
printf("%#hhx\n",0x12345678); //ARM架构存储数据一般采用大端模式,即数据的高字节存储在数据的低地址
printf("%#hx\n",0x12345678); //
printf("%e\n",3.14); //以科学计数法的格式输出
printf("%c\n",65); //输出65对印的字符
char *a="zhubb is the best engineer";
printf("%p\n",&a); //取a的地址并输出
printf("%s\n",a); //传入指针,输出全部字符
printf("%.5s\n",a); //传入指针,输出前5个字符
printf("%%\n" ); //输出百分号%
printf("\"\"\n" ); //输出双引号“”
return 0;
}
运行结果:

二、缓冲区
计算机的CPU的性能好,所以CPU的执行效率高,但是计算机的输入设备和输出设备的效率低,所以CPU为了提高工作效率,要降低访问输入输出设备的次数。所以内存会提供一块空间作为数据缓冲区。根据IO设备的不同,可以把缓冲区分为输入缓冲区和输出缓冲区,同样,根据刷新形式的不同,可以把缓冲区分为三种:全缓冲、行缓冲、无缓冲。
全缓冲:指的是当缓冲区被填满就立即把数据冲刷到文件、或者在关闭文件、读取文件内容以及修改缓冲区类型时也会立即把数据冲刷到文件,一般读写文件的时候会采用
无缓冲:指的是没有缓冲区,直接输出,一般linux系统的标准出错stderr就是采用无缓冲,这样可以把错误信息直接输出。
行缓冲:指的是当缓冲区被填满(一般缓冲区为4KB,就是4096字节)或者缓冲区中遇到换行符’\n’时,或者在关闭文件、读取文件内容以及修改缓冲区类型时也会立即把数据冲刷到文件中,一般操作IO设备时会采用,比如printf函数就是采用行缓冲。
程序结束时会自动刷新缓冲区,如果输入缓存区中存在数据则被丢弃,如果输出缓存区存在数据,则会输出。
用户也可以选择手动刷新缓冲区,可以调用标准C库中的fflush()函数接口
注意:不要利用fflush函数去刷新输入缓冲区(stdin) ,因为一般编译器是不支持该操作!!!
#include <stdio.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
printf("hello\n");
fflush(stdout);
sleep(5);
printf("world\n");
while(1);
return 0;
}
输出结果:

#include <stdio.h>
int main(int argc, char const *argv[])
{
int i=43;
printf("%d",printf("%d",printf("%d",i )));
//最内层输出字符串43,返回值为2,控制台输出43
//中间层输出字符串2,返回值为1,控制台累计输出432
//最外层接收参数1并输出,总输出:4321
return 0;
}
输出结果:
三、格式化输入
用户会使用标准输入设备(键盘)写入数据(回车->\n,输入缓冲区刷新),所以标准C库提供了一个输入函数scanf(),作用是把数据流写入到内存中,scanf指的是scan format,翻译为格式化扫描,用法类似于printf函数。
scan函数有返回值,输入失败则返回宏EOF(-1),成功则返回成功完成赋值的输入项个数
如果在scanf的字符串中使用了多个转换说明符,则输入的数据类型必须个转换类型一一对应。
匹配字符[],‘-’在[]中可以当作连接符,需要匹配的字符序列在[]中,如果[^],则表示不匹配的字符序列。
#include <stdio.h>
int main(int argc, char const *argv[])
{
char buf[10] = {0}; //定义一个可以存储10个字符的数组
scanf("%[0-9]s",buf); //只接受字符0-9,输入其他字符则结束输入
printf("buf = %s\n",buf);
return 0;
}
运行结果:

#include <stdio.h>
int main(int argc, char const *argv[])
{
char buf[10] = {0}; //定义一个可以存储10个字符的数组
scanf("%[^0-9]s",buf); //不接受字符0-9,输入0-9则结束输入
printf("buf = %s\n",buf);
return 0;
}
运行结果

作者:bbzhu04@gmail.com ,多有不妥之处,望批评指正
本文原创,欢迎转载;转载请在文章显著位置标明原文链接: href="https://www.cnblogs.com/zhubb/p/22012808"
保留所有权限,未经许可禁止篡改、商用发布。

浙公网安备 33010602011771号