使用输入输出函数前,必须包含头文件<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);

通过左对齐(-)和固定域宽,让输出整齐有序,提升可读性。这种格式化方式在数据展示类程序中非常实用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐