C 语言字符串输入输出:scanf, gets, fgets 的选择与陷阱
各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在 C 语言编程中,处理字符串是常见的任务之一。而将字符串从用户(通常通过键盘)读取到程序中,以及将程序中的字符串显示给用户,是字符串处理的基础。本文将深入探讨 C 语言中用于字符串输入输出的几个核心函数:printf
, scanf
, gets
, 和 fgets
,并通过详细的代码示例,帮助您理解它们的用法、特性以及潜在的风险,特别是如何安全地进行字符串输入。
1. 字符串输出:printf
的 %s
首先,我们来看字符串的输出。在 C 语言中,我们主要使用 printf
函数配合 %s
格式说明符来打印字符串。%s
格式说明符期望接收一个字符数组(也就是字符串)的起始地址,然后从该地址开始,逐个打印字符,直到遇到字符串的结束标志 \0
为止。
#include <stdio.h>int main() {printf("--- 字符串输出示例 ---\n");char my_string[] = "Hello, C Language!"; // 使用字符串字面量初始化,编译器自动添加 '\0'printf("使用 %%s 打印字符串:\n");printf("%s\n", my_string); // %s 遇到 '\0' 停止打印printf("--- 示例结束 ---\n");return 0;
}
编译和运行:
gcc print_string.c -o print_string
./print_string
运行结果:
--- 字符串输出示例 ---
使用 %s 打印字符串:
Hello, C Language!
--- 示例结束 ---
printf("%s", ...)
的使用相对简单,只要确保您传递的是一个以 \0
结尾的有效 C 语言字符串即可。
2. 字符串输入:挑战与不同函数
字符串输入相对复杂,因为用户可能输入包含空格的文本,而不同的输入函数处理空格和换行符的方式不同。
2.1 scanf
函数与 %s
scanf
函数是 C 语言中常用的输入函数,配合 %s
格式说明符可以读取字符串。然而,scanf
在读取字符串时有一个非常重要的特性:它会跳过开头的空白字符(空格、制表符、换行符),然后从第一个非空白字符开始读取,直到遇到下一个空白字符为止。这意味着 scanf("%s", ...)
只能读取单个词,无法读取包含空格的整行文本。
此外,scanf
不会检查你提供的字符数组缓冲区的大小,如果用户输入的字符串长度超过了缓冲区的大小,就会发生缓冲区溢出,这是非常危险的。虽然可以通过 %ns
(其中 n 是数字) 来限制读取的最大字符数(如 %9s
最多读 9 个字符 + \0
),但这种方式仍然不够灵活和安全。
示例代码 2.1:
#include <stdio.h>int main() {printf("--- 使用 scanf 读取字符串 ---\n");char buffer[20]; // 定义一个大小为 20 的字符数组printf("请输入一个字符串 (包含空格测试):\n");// 使用 %s 读取字符串//