一,简单的C程序的I/O
程序完成:获取从键盘输入的字符并将其发送至屏幕。
#include<stdio.h>; int main(void) { char ch; while((ch=getchar())!='#') putchar(ch); return 0; }
我们会想到一个问题:回显输入之前为什么必须键入完整的一行。你可能想得到下面的结果:
MMyy nnaammee iiss RRoonnnnyy YYoouunngg
ccoommppuutteerr
二,缓冲区
输入字符立即回显是非缓冲或直接输入的一个形式,它表示你所键入的字符对正在等待的程序立即变为可用。相反,延迟回显是缓冲输入的例子,这种情况下你所键入的字符块被收集并存储在一个被称为缓冲区的临时存储区域中。按下回车键可使你输入的字符段对程序起作用。
缓冲输入一般常用在文本程序内,当你输入有错误时,就可以使用你的键盘更正修正错误。当最终按下回车键时,你就可以发送正确的输入。
而在一些交互性的游戏里需要非缓冲输入,如:游戏里你按下一个键时就要执行某个命令。
缓冲分为两类:
1,完全缓冲:缓冲区被充满时被清空(内容发送到其目的地)。这种类型的缓冲通常出现在文件输入中。
2,行缓冲:遇到一个换行字符时被清空缓冲区。键盘的输入是标准的行缓冲,因此按下回车键将清空缓冲区。
三,重定向与文件
一般情况下,我们写的简单的C程序,都是用键盘作为输入,用屏幕显示输出结果,我们可以用重定向命令,用文件来作为输入或输出。
1,输入重定向:studyc < input.txt
2,输出重定向:studyc > output.txt
3,组合重定向:studyc <input.txt >output.txt 或者 studyc>output.txt<input.txt
四,使用缓冲输入时的问题
下面这个程序,不断的读入字符,当输入字符不与预设匹配时,有警告信息。
#include<stdio.h>; int main(void) { char ch; while((ch=getchar())!='a') printf("Warning,please Enter another char.\n"); return 0; }
运行程序会得到下面的结果:
可以看出,我们每次输入错误匹配时,都发出了两次警告。原因是,当我们键入回车来提交输入时,回车会作为下一次的输入被判定。
可以用下面的方法来避免这一问题:
#include<stdio.h>; int main(void) { char ch; while((ch=getchar())!='a') { printf("Warning,please Enter another char.\n"); while(getchar()!='\n') continue; } return 0; }
用一个getchar()的读循环来接收了回车和其他多余的输入。
请记住,在用循环来不断读入字符时,一定要考虑到换行符作为下一次输入的影响,如上面代码那样,在后面加上一个循环的读入,可以忽略后面的字符。
五、准确提示用户输入一个整数
我们有时候需要用户去输入一个字符或数字,但是有时用户并不按我们的意愿去做,这时我们要用良好的提醒与处理能力。
#include<stdio.h> int main(void){ int input; char ch; while((scanf("%d",&input))!=1) { while((ch=getchar())!='\n') putchar(ch); printf(" is not an integer number.\n"); printf("Please Enter an integer value,such as 25,-178, or 3:"); } printf("The integer number you input is %d\n",input); return 0; }
程序的运行结果显示如下: