8.3 字符、字符串与按行 I/O
C 还提供了更小粒度的 I/O 工具,可以处理单个字符,也可以处理整段字符串。这些函数既可以配合控制台流 stdin、stdout,也可以配合 fopen() 打开的文件流。
| 函数 | 使用的流 | 做什么 | 关键细节 |
|---|---|---|---|
getchar() | stdin | 读取一个字符 | 返回 int,这样才能返回 EOF |
putchar(ch) | stdout | 写出一个字符 | 只写出这一个字符 |
fgetc(fp) | 文件流 | 从文件读取一个字符 | 返回 int,用于判断 EOF |
fputc(ch, fp) | 文件流 | 向文件写出一个字符 | 适合做字符级过滤 |
puts(text) | stdout | 写出一个字符串 | 会自动补换行 |
fputs(text, fp) | 文件流 | 写出一个字符串 | 不会自动补换行 |
fgets(buf, size, stream) | 任意输入流 | 最多读入 size - 1 个字符 | 不会写出缓冲区边界 |
gets(buf) | stdin | 旧式的不安全整行输入 | 不要使用,它没有长度限制 |
控制台上的单字符 I/O 常见写法如下:
c
int ch;
while ((ch = getchar()) != EOF) {
putchar(ch);
}同样的模式也可以逐字符处理文件:
c
FILE *in = fopen("raw.txt", "r");
FILE *out = fopen("clean.txt", "w");
int ch;
while ((ch = fgetc(in)) != EOF) {
if (ch == '\t') {
fputc(' ', out);
} else {
fputc(ch, out);
}
}
fclose(out);
fclose(in);处理字符串和整行文本时,优先使用 fgets(),因为它会接收缓冲区大小:
c
char line[80];
while (fgets(line, sizeof(line), stdin) != NULL) {
fputs(line, stdout);
}你可能会在旧资料里看到 gets(buffer),但它无法知道 buffer 有多大,可能写到数组外面。现代 C 已经移除了它,实际写程序时请用 fgets()。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...