第八章 字符输入/输出验证

  • 8.2 缓冲区

  • 有缓冲和无缓冲

    • 有缓冲:程序读取输入时先将其放在一个缓冲区,缓冲 I/O 分为行缓冲 I/O 和 完全缓冲 I/O。
      • 行缓冲 I/O 指当读取到一个换行符(\n)时将缓冲区刷新(将缓冲区的数据传输到程序中)。
      • 完全缓冲 I/O 指当缓冲区满时,刷新缓冲区(将数据传递到程序)。
    • 无缓冲:读取一个输入,程序就直接使用这个数据。


  • 8.3 结束键盘输入

  • 8.3.1 文件、流和键盘输入

    • 文件:文件是存储器中存储信息的区域 //文件名即地址
    • 某些程序需要读取特定的文件
  • 8.3.2 文件结尾

    • 1.在文件的最后放一个特殊的字符标记文件的结尾。 // 一般的DOS用Ctrl + z标记文件的结尾.
    • 2.记录文件的大小,例如一个文件的大小是4000字节,程序读到4000字节时就达到文件的末尾.
    • 在c语言中,用 getchar() 读取文件检测到文件结尾就返回一个特殊的值,即 EOF.(EDF通常被定义为 -1,但一些操作系统也会将其定义为其他的数), //即可以使用EDF 常量来作为文件的结尾,测试的时候输入Ctrl + z即可.
  • // 什么是流

    • C程序处理的是流而不是文件
    • 流:统一的分类
      • 标准输入流(stdin流)即,输入程序的数据流,可以是一个文件,可以是键盘,鼠标……
      • 在c语言中,键盘,鼠标等输入流都可看做一个文件.

  • //忽略空格 , 按下空格只是清除缓冲区(将缓冲区的数据传输进程序中进行处理),并不是程序的结束,,
    //这种情况只是因为按下空额然后吧缓冲区的数据送入了程序内处理了,getchar()没有读到代表结束的’#’,所以还是可以继续输入的.
    //如果要全部输入完(包括换行)然后再打印,那么直接将处理的每个字符(进入程序的数据)储存在一个字符数组中,当输入结束字符跳出循环后再打印就可以了.
	char a,b[50];
	int i = 0;
	while((a = getchar()) != EOF)//可以将结束字符EOF改为任何表示结束的字符
	{
		b[i] = a;
		i++;
	}
	printf("%s",b);


  • 8.4重定向和文件

  • 8.4.1 UNIX、Linux、DOS重定向输入、输出

    • 重定向符号 : < 或者 >
    • A<T.txt表示将程序A的输入流重定向到文档T中 //A从T.txt中获取输入而不是键盘
    • A>T.txt表示将程序A的输出流重定向到文档T中 //A将程序的返回输入到T.txt中而不是屏幕上
    • 不可用于链接两个数据文件或两个程序,不可同时重定向两个输入或输出。
    • >> 运算符可以将输出添加到现有文件的末尾.
  • 8.6 输入验证

    • //判断输入的数据是否有效

    • 可以将检测输入验证的程序定义为一个函数
//处理非负数
long get_long(void)
{
	int input;
	char ch;
	
	while(scanf("%u",&input) != 1)   //先如果输入的东西不是正整数就进入循环
	{
		while((ch = getchar()) != '\n')
			putchar(ch);
		printf("不是正确的输入,请重新输入");
	}
	return input;

  • //以下程序计算用户输入范围内的数的平方和,主要检测用户输入的数据是否为有效数据。

// 8.7 checking.c 
#include<stdio.h>
#include<stdbool.h>
long get_long(void); //判断输入的数是否为整数 每次能判断一个数,返回值为有效输入的数
bool good_input(long begin,long end,long low,long high);//判断输入的范围是否有效 ,有效则返回true
unsigned long sum_squres(long begin,long end);//计算平方和 返回最终结果
int main(void)
{
	const long HIGH = 10000;
	const long LOW = -10000;
	long input_a,input_b;
	
again_input : 
	printf("请输入范围的下限");
	input_a = get_long();
	printf("\n请输入范围的上限");
	input_b = get_long(); 		//分别存储有效输入的整数
	
	if(good_input(input_a,input_b,LOW,HIGH))
		printf("%ld至%ld范围内的数的平方和为%lu"
		,input_a,input_b,sum_squres(input_a,input_b));
	else
		goto again_input;
		
	return 0;
} 

long get_long(void)
{
	long input;
	char ch;
	while(scanf("%ld",&input) != 1)//直到输入一个有效数值才跳出循环 
	{
		while((ch = getchar()) != '\n')
			putchar(ch);
		printf(" 不是有效的输入,请重新输入"); //如果输入的不是一个整数则打印 
	}
	
	return input; 
}

bool good_input(long begin,long end,long low,long high)
{
	bool good_input = true;
	
	if(end < begin)
	{
		printf("下限不能大于上限,请重新输入下限\n");
		good_input = false;
	} 
	else if(begin < low)
	{
		printf("输入的下限超出系统处理的下限,请重新输入\n");
		good_input = false; 
	}
	else if(end > high)
	{
		printf("输入的上限超出系统处理的上限,请重新输入\n"); 
		good_input = false;
	}
	
	return good_input;
}

unsigned long sum_squres(long begin,long end)
{
	long long sum = 0;
	while(begin <= end)
	{
		sum += begin*begin;
		begin++;
	}
	
	return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值