第八章 字符输入/输出和输入验证
8.1 单字符 I/O:getchar() 和 putchar()
8.2 缓冲区
无缓冲输入:输入字符后,程序马上能读取字符;
缓冲输入:输入的字符临时缓存,特定条件后(缓冲区满/输入 Enter
)刷新,程序才能读取字符;
- 大多数系统都是此方式,一次发送多个比逐个发送节约时间;
- 方便修正要发送的数据;
完全缓冲:只有在缓冲区满时才刷新缓冲区;
行缓冲:按下 Enter
后刷新缓冲。
8.3 结束键盘输入
C 函数读取到文件末尾时,会返回 EOF
,当输入是键盘时,可以模拟文件末尾(Windows:CTRL + Z
;Linux:CTRL + D
)。
8.4 重定向和文件
重定向:C
程序默认从 stdin
获取数据,不改变输入函数和数据类型,仅改变程序查找数据的位置。可以用 <
,>
重定向输入,输出
8.5 创建友好的用户界面
使用缓冲输入
输入缓冲要求用户按下 Enter
键,换行符同时也会被发送过来,需要谨慎处理这个麻烦的换行符。类似如下处理:
while(getchar() != 'y') /* 获取响应,与 y 做对比 */
{
printf("Well,then, is it %d?\n", ++guess);
while(getchar() != '\n')
continue; /* 跳过剩余的输入行 */
}
混合数值和字符输入
scanf
不会读取 Enter
,空格,制表符,会留在输入队列。scanf
之后需要清理剩下的输入,类似处理如下:
if(scanf("%d %d", &rows, &cols) != 2)
break;
display(ch, rows, cols);
while(getchar() != '\n')
continue;
8.6 输入验证
用于用户输入数据和程序期望输入不匹配时,比如如下处理输入数据类型不匹配,当且仅当用户输入一个正整数时为真:
while(scanf("%ld", &n) == 1 && n >= 0)
8.7 菜单浏览
保证目标:
- 当用户遵循指令时程序顺利运行;
- 当用户没有遵循指令时,程序也能顺利运行。