03常用输入输出函数
使用输入输出函数前,必须包含头文件<stdio.h>,这是标准输入输出库的声明所在。C 程序的执行入口是 main 函数,程序从 main 函数的第一句开始执行,直到遇到 return 语句或 main 函数结束。

使用输入输出函数前,必须包含头文件<stdio.h>,这是标准输入输出库的声明所在。C 程序的执行入口是 main 函数,程序从 main 函数的第一句开始执行,直到遇到 return 语句或 main 函数结束。
putchar() & getchar()
单个字符函数适用的简单的字符输入输出。
putchar ()
putchar(ch);
putchar('a'); #字符常量
char c='b'; putchar(c); #字符变量
putchar(97); #ASCII 码值
ch 可以是字符常量、字符变量,也可以是 ASCII 码值。
函数执行成功后,返回输出字符的 ASCII 码;
失败则返回 EOF(值为 - 1,通常表示输入输出错误)。
getchar ()
char ch=getchar()
它从终端接收一个字符,包括空格、换行符等空白字符,执行时会阻塞等待用户输入。
注:getchar 会读取输入缓冲区中的字符,如果之前有残留字符(比如 scanf 输入后未读取的换行符),会导致 getchar 直接读取残留字符,而非用户后续输入的字符,此时可以用getchar()清空缓冲区。
printf() & scanf()
printf()
printf 是格式化输出的核心函数,能灵活控制输出格式。它的控制符必须与变量类型匹配,否则会输出乱码:
% d 对应有符号十进制整数(int、short)
% u 对应无符号十进制整数
% x/% X 对应十六进制整数(小写 / 大写字母)
% f 对应浮点数(float、double)
% c 对应字符
% s 对应字符串
% p 对应指针地址
%% 用于输出百分号。
printf 支持多种格式化修饰,能让输出更整齐:
% nd 表示域宽为 n,不足 n 位时右对齐,左边补空格
printf("%5d", 123); #输出 " 123"
%0nd 表示不足 n 位时左边补 0
printf("%05d", 123); #输出 "00123"
%-nd 表示左对齐,右边补空格
printf("%-5d", 123); #输出 "123 "
%.mf 表示保留 m 位小数(四舍五入),
printf("%.2f", 3.1415); #输出 "3.14"。
转义字符能提升输出的可读性,常用的有:
\n(换行)
\t(横向制表符,用于对齐列)
\b(退格,删除前一个字符)
\r(回车,光标回到行首)
scanf()
scanf 是格式化输入函数,用于读取用户输入并赋值给变量。
它的控制符也要与变量类型匹配:
% d 读取 int 型
% hd 读取 short 型
% ld 读取 long 型
% f 读取 float 型
% lf 读取 double 型(必须用 % lf,否则赋值错误)
% c 读取 char 型,% s 读取字符串
scanf 的使用有几个关键注意点:
除了 % s,其他变量都需要加 & 符号取地址,,&a 表示变量 a 的内存地址,scanf 需要将输入值存入该地址);
% s 直接传入数组名即可,因为数组名本身就是数组的首地址。
scanf("%d", &a);
char str[32]; scanf("%s", str);
scanf 中的非控制符需要用户原样输入,比如
scanf("a=%d", &a);
用户必须输入 "a=10" 才能正确读取 a 的值,否则读取失败。
% c 的一个常见陷阱是会读取输入缓冲区中的空格、换行符,比如
先执行
scanf("%d", &a); #(输入 10 后按回车,缓冲区残留 '\n')再执行
scanf("%c", &ch); #ch 会读取 '\n',而非用户后续输入的字符。
解决方法是在 % c 前加空格过滤空白字符,即
scanf(" %c", &ch);
% s 的限制是不接收含空格的字符串,遇到空格或换行符就停止读取,比如输入 "hello world",仅能读取 "hello",若要读取含空格的字符串,需要用 gets 或 fgets 函数。
puts() & gets()
puts()
字符串输入输出函数中,puts 函数的语法是
puts(str);
功能是输出字符串并自动在末尾加换行符,相当于
printf("%s\n", str)
puts 遇到 '\0' 会停止输出,比如
char str[] = "hel\0lo"; puts(str); #输出 "hel"。
gets()
gets 函数的语法是
gets(str);
它从终端接收字符串,直到遇到换行符为止,会自动丢弃换行符,并在字符串末尾加 '\0'。
gets 的优点是能读取含空格的字符串,但缺点是无输入长度限制,若输入字符数超过数组大小,会导致缓冲区溢出,破坏其他内存数据,存在安全风险,推荐用 fgets 替代。
学习思考
printf 中 % f 既能处理 float 又能处理 double,而 scanf 中 double 必须用 % lf,这是由函数的参数传递规则决定的。
printf 的参数采用 “可变参数列表”,float 型参数会被隐式转换为 double 型后传递,因此 % f 既能接收 float(转换后的 double)也能接收 double;而 scanf 需要直接修改变量的值,必须明确变量的类型,double 型变量的地址必须对应 % lf,否则会导致内存访问错误。
gets 函数的缓冲区溢出风险需要高度重视。比如定义
char str[5]; gets(str);
若输入 "123456"(6 个字符 +'\0' 共 7 字节),会超出 str 的 5 字节空间,覆盖后续内存中的变量,导致变量值被篡改,甚至程序崩溃。
fgets 函数通过指定最大读取长度规避了这一风险,语法为
fgets(str, sizeof(str), stdin);
其中 sizeof (str) 指定最大读取字节数,预留 1 字节存储 '\0',超出部分会被截断。
复杂的格式化输出可以通过修饰符组合实现,比如打印学生信息表格时,用
printf("%-10s %-5d %-6.1f\n", "张三", 20, 95.5);
通过左对齐(-)和固定域宽,让输出整齐有序,提升可读性。这种格式化方式在数据展示类程序中非常实用。
更多推荐



所有评论(0)