C primer plus Chapter 8 Input/Output and Input Validation

Chapter8 Character Input/Output and Input Validation

8.1 Single-characterI/O: getchar(); putchar()

getchar()

  • 返回值为输入字符的ASCII码,是int类型。
  • 程序在调用这个函数时,会等待用户输入并将用户的输入存进缓冲区。当用户按下空格时,getchar()开始读取缓冲区的字符
  • 会读取换行符等。

putchar()

8.2 缓冲区(buffer)

  • 为什么要有缓冲区:把若干字符一起发送更节约时间
  • 完全缓冲i/o和行缓冲i/o:
    • 完全缓冲是指缓冲区被填满之后才会刷新缓冲区,常见于文件输入。缓冲区的大小由系统决定 常见的是512字节和4096字节。
    • 行缓冲是指在出现换行符时刷新缓冲区

8.3 结束键盘输入

8.3.1 文件,流和键盘输入

  • 文件:存储器中存储信息的区域。
  • 底层I/O: 直接调用主机操作系统的基本文件工具直接处理文件。
  • 较高层面 c通过标准io来处理文件,可以处理不同系统间的差异。
  • 上述讨论的差异是指:
    • 不同的系统存储文件的方式不同。
    • 不同系统标识结尾的方式不同。
    • 有些系统文件数据本身和文件相关信息存储在一处,有些系统存储在不同的区域。
  • 如果使用标准io,不需要考虑这些因素。
  • 流(stream):是一个实际输入或者输出的映射的理想化数据流,,不同属性和不同种类的输入,由属性更加统一的流来表示。(详见13章)

8.3.2 文件结尾

在一些操作系统中使用
  • 使用特殊字符:例如\h+z
  • 通过记录文件长度。
在c语言中
  • getcahr()在读到文件末尾会返回一个特殊的值EOF EOF在stdio.h文件中的定义为 #define EOF (-1)
    • 因为getchar()返回的指一般在0-127之间,所以-1不对应任何字符。
#include<stdio>
int main(void){
	int ch;
	while((ch=getchar())!=EOF){
		putchar(ch);
	}
	return 0;
}
    • ch是整型不会影响putchar输出。
    • 在使用该程序输入时,要设法输入EOF 不能输入-1 ,因为会被识别为两个符号,在大多数UNIX和Linux系统中,Ctrl+D会传送文件结束符号。

8.4 重定向文件

8.4.1 UNIX Linux DOS 重定向
1.重定向输入输出
  • 文件重定向输入输出就是将文件的内容给标准输入流,即让程序的输入不是键盘,而是文件。重定向输出让程序不是输出到屏幕上而是文件中。
  • 例: 假设 echo_eo。exe 是已经编译的文件。
    echo_eof < words
    因为c把文件和I/O放在一个层面,所以并不关心输入的来源。
  • 例:重定向输出
    echo_eof > mywords
2.组合重定向
  • 重定向符号规则:
  1. 重定向运算符连接一个可执行文件和一个数据文件
  2. 使用重定向运算符不能从多个文件获取输入或输出到多个文件。
  3. 输入和输出文件名不能相同,
  4. addition: UNIX Linux 和Windows/DOS还有>> 运算符,把数据添加到现有文件的末尾。而|运算符能把一个文件的输出连接到另一个文件的输入。
3.注释
  • VS 将编译后的可执行文件放在项目文件夹的子文件夹 称为Debug

8.5 创建更友好的用户界面(一定要注意最后的换行符!!!)

8.5.1 使用缓冲输入
  • 缓冲输入要求用书按下enter发送输入,这一动作也传送了换行符。程序员需要合理处理这个换行符。
  • 例子
#include<stdio>
int main(void){
	int guess = 1;
	printf("Pick an integer from 1 to 100,I'll try to guess")
	printf("it.\nResponse with a y if my guess is right or with")
	printf("\nAn n if it is wrong")
	printf("ummm is your number is %d",guess)
	while(getchar()!="y"){
		printf("well, is it %d",++guess)
	}
	return 0
}

这段代码是有问题的,用户输入y后会跟一个enter,在while语句的判断过程中,会认为用户否认了一个答案。
修改

while(getchar()!="y"){
	while(getchar()!="\n"):
	continue;
}

8.6 输入验证

即处理用户的非法输入,具体情况具体分析。
本章没有特别复杂的知识点,主要理解缓冲区,和重定向。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值