第8章 字符输入/输出和输入验证
在编写C程序时,输入和输出(I/O)是至关重要的部分。本章将详细介绍如何处理字符输入和输出,以及如何进行输入验证。我们将讨论缓冲输入与无缓冲输入的区别,并学习如何通过键盘模拟文件结束条件,使用重定向将程序与文件连接,并创建更友好的用户界面。
8.1 单字符I/O: getchar()
和putchar()
在第7章中,我们已经简单接触了getchar()
和putchar()
这两个函数。它们每次处理一个字符,这可能看起来效率不高,但在许多情况下,这种逐字符处理方法是非常合适的。例如,在处理逐字符输入时,这些函数可以帮助程序更好地控制输入流。
示例程序:echo.c
为了理解getchar()
和putchar()
的使用方式,我们可以看看程序清单8.1中的echo.c
程序。这个程序的作用是重复输入的字符,直到遇到结束符号#
。
/* echo.c -- 重复输入 */
#include <stdio.h>
int main(void) {
char ch;
while ((ch = getchar()) != '#') {
putchar(ch);
}
return 0;
}
这个简单的程序演示了如何使用getchar()
从输入流中读取字符,并使用putchar()
将字符输出到屏幕上。
缓冲区和输入方式
在执行上述程序时,你可能会注意到输入的字符在按下回车键之前不会立即显示在屏幕上。这是因为C语言的标准输入是缓冲输入。这意味着输入的字符会被收集到缓冲区中,直到用户按下回车键,这些字符才会被处理。
缓冲输入 vs 无缓冲输入
在缓冲输入模式下,用户的输入首先进入缓冲区,按下回车键后,缓冲区的内容才被程序读取。这种模式的优点是可以一次性处理多个字符,并允许用户在按下回车键之前修改输入内容。
相反,无缓冲输入允许程序在字符输入后立即处理。这在需要即时响应的程序(例如游戏)中非常有用。在这些情况下,按键需要立即触发相应的动作,而不是等待整个输入完成。
缓冲区的类型
C语言支持两种缓冲方式:
- 完全缓冲:缓冲区满时才刷新,通常用于文件输入。
- 行缓冲:当检测到换行符时刷新,常用于键盘输入。
在本节中,我们主要讨论了如何使用getchar()
和putchar()
进行单字符输入/输出操作。这些函数是理解C语言I/O处理的基础,同时也是构建更复杂输入输出机制的起点。
总结
getchar()
和putchar()
尽管简单,但在需要精确控制输入和输出的场景中非常有用。理解缓冲输入和无缓冲输入之间的区别,可以帮助我们更好地设计用户交互和响应速度的程序。通过本节的学习,你应当能够掌握基本的字符输入输出操作,并理解C语言中I/O处理的基础概念。
在接下来的章节中,我们将继续探讨更多复杂的I/O函数以及如何进行输入验证,以构建更加可靠和用户友好的程序。