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;
}

运行结果:

image

二、缓冲区

计算机的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;
}

输出结果:

image

#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;
}

输出结果:image

三、格式化输入

用户会使用标准输入设备(键盘)写入数据(回车->\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;
}

运行结果:

image

#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;
}

运行结果

image

posted @ 2026-07-28 18:19  !城北徐公.!  阅读(13)  评论(0)    收藏  举报