C Primer Plus (第六版) 中文版 随手笔记(七)

声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。

作者:sumjess

适用:这本书我已经看过4遍了,但是该书的知识点我并不是都常用,所以总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做你的笔记。

目前内容:第八章总结

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


1、缓冲区:

    (1)回显用户输入的字符后立即重复打印该字符是属于无缓冲(或直接)输入,即正在等待的程序可立即使用输入的字符;

    (2)大部分系统在用户按下Enter键之前不会重复打印刚输入的字符,这种输入形式是属于缓冲输入;

    (3)用户输入字符被收集并储存在一个被称为缓冲区的临时储存区。

    (4)缓冲分两种:完全缓冲I/O和行缓冲I/O。

                                 完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现                                  在文件输入中。

                                 行缓冲I/O指的是在出现换行符时刷新缓冲区(键盘输入通常是行缓冲输入)。

    (5)回显无缓冲输入的getchar()函数和用于无回显无缓冲输入的getch()函数(回显输入意味着用户输入的字符直接显示在屏幕上,无回显输入意味着击键后对应的字符不显示)。

2、结束键盘输入:

    (1)文件、流和键盘输入:

                 ① 文件是存储器中储存信息的区域。

             ② C是一门强大、灵活的语言,有许多用于打开、读取、写入和关闭文件的库函数。从较低层面上,C可以使用主机操作系统的基本文件工具直接处理文件,这些直接调用操作系统的函数被称为底层I/O。从较高层面上,C还可以通过标准I/O包来处理文件。

             ③ 如果使用标准I/O包,就不用考虑这些差异。即使系统用的是回车符和换行符的组合来标记行末尾,I/O函数会在两种表示法之间相互转换。

             ④ 流是一个实际输入或输出映射的理想化数据流。

            ⑤ C把输入和输出设备视为存储设备上的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。stdin流表示键盘输入,stdout流表示屏幕输出。getchar()、putchar()、printf()、scanf()函数都是标准I/O包的成员,处理这两个流。

      以上讨论内容说明可以用处理文件结尾的方式来处理键盘输入。

    (2)文件结尾:

检测文件结尾的一种方法是,在文件末尾放一个特殊字符标记文件结尾。

在C语言中,用getchar()读取文件检测到文件结尾时,将返回一个特殊的值,即EOF。scanf()函数检测到文件末尾时也返回EOF。通常,EOF定义在stdio.h文件中:

#define EOF (-1)

为什么是-1呢?   因为getchar()函数的返回值通常都介于0~127,这些值对应标准字符集。无论哪种情况,-1都不对应任何字符,所以,该值可用于标记文件结尾。

如何使用EOF?

while((ch=getchar())!=EOF)
     putchar(ch);
注意以下几点:

■ 不用定义EOF,因为stdio.h中已经定义过了。

■ 不用担心EOF的实际值,因为EOF在stdio.h中用#define预处理指令定义,可直接使用,不必在编写代码假定EOF为某值。

3、重定向和文件:

    (1)两种方式使用文件:

           ① 显式使用特定的函数打开文件、关闭文件、读取文件、写入文件。

              ② 设计能与键盘和屏幕互动的程序,通过不同的渠道重定向输入至文件和从文件输出。换言之,把stdin流重新赋给文件。继续使用getchar()函数从输入流中获取数据。

    (2)重定向输入:

            ① 文本文件是内含文本的文件,其中储存的数据是我们可识别的字符;

            ② <符号是Unix和DOS/windows的重定向运算符;

    (3)重定向输出:

            ① >符号是第二个重定向运算符。它创建了一个名为mywords的新文件,然后把echo_eof的输出(即,你输入字符的副本)重定向至该文件中。重定向把stdout从显示设备(即,显示器)赋给mywords文件。

    (4)组合重定向:

            现在,假设你希望制作一份mywords文件的副本,并命名为savewords。只需输入以下命令即可:

echo_eof < mywords > savewords
下面的命令也起作用,因为命令与重定向运算符的顺序无关;
echo_eof > savewords < myworods
注意:在一条命令中,输入文件和输出文件名不能相同。
echo_eof < mywords > mywords.....<--错误
原因是> mywords在输入之前已导致原mywords的长度被截为零。

总之,在Unix、Linux、windows/DOS系统中使用两个重定向运算符(<和>)时,要遵循以下原则:

■ 重定向运算符连接一个可执行程序(包括标准操作系统命令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。

■ 使用重定向运算符不能读取多个文件输入,也不能把输出定向至多个文件。

■ 通常,文件名和运算符之间的空格不是必须的,除非是偶尔在Unix shell、Linux shell或windows命令行提示模式中使用的有特殊含义的字符。

Unix、Linux、windows/DOS还有>>运算符,该运算符可以把数据添加到现有文件的末尾,而|运算符能把一个文件的输出连接到另一个文件的输入。

   小结:如何重定向输入和输出?

        绝大部分C系统都可以使用重定向,可以通过操作系统重定向所有程序,或只在C编译器允许的情况下重定向C程序。假设prog是可执行程序名,file1和file2是文件名。

        把输出重定向至文件:>

         prog > file1

        把输入重定向至文件:<

         prog < file2

        组合重定向:

         prog < file2 >file1

         prog> file1 <file2

 这两种形式都是把file2作为输入、file1作为输出。

留白:

一些系统重定向运算符左侧有一个空格,右侧没有空格。而其他系统允许在重定位运算符两侧有空格或没有

空格。

4、创造更友好的用户界面:

    (1)使用缓冲输入:

    (2)混合数值和字符输入:

               getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跳过空格、制表符和换行符。

5、输入验证:

               ① 虽然checking.c程序的核心计算部分(sum_aquares()函数)很短,但是输入验证部分比以往程序示例都要复杂。所以,程序应该遵循模块化的编程思想,使用独立函数(模块)来验证输入和管理显示。程序越大,使用模块化编程就越重要。

               ② 输入流和数字

6、菜单浏览:

               ① 任务

               ② 使执行更顺利

               ③ 混合数值和字符输入

7、关键概念:

C程序把输入作为传入的字节流。getchar()函数把每个字符解释成一个字符编码。scanf()函数以同样的方式看待输入,但根据转换说明,它可以把字符输入转换成数值。许多操作系统都提供重定向,允许用文件代替键盘输入,用文件代替显示器输出。

程序通常接受特殊形式的输入。可以在设计程序时考虑用户在输入时可能犯的错误,在输入验证部分处理这些错误情况,让程序更强健友好。

对于一个小型程序,输入验证可能是代码中最复杂的一部分。处理这类问题有很多方案。例如,如果用户输入错误类型信息,可以终止程序,也可以给用户提供有限次或无限次机会重新输入。

8、本章小结:

许多程序使用getchar()逐字符读取输入。通常,系统使用行缓冲输入,即当用户按下enter键后输入才被传送给程序。按下enter键也传送了一个换行符,编程时要注意处理这个换行符。ANSI C把缓冲输入作为标准。

通过I/O包中的一系列函数,以统一的方式处理不同系统中的不同文件形式,是C语言的特性之一。getchar()和scanf()函数也属于这一系列。当检测到文件结尾时,这两个函数返回EOF(被定义在stdio.h头文件中)。在不同系统中模拟文件结尾条件的方式稍有不同。

许多操作系统(Unix和DOS)都有重定向的特性,因此可以用文件代替键盘和屏幕进行输入和输出。读到EOF即停止读取的程序可用于键盘输入和模拟文件结尾信号,或用于重定向文件。

混合使用getchar()和scanf()时,如果在调用getchar()之前,scanf()在输入下一行留下一个换行符,会导致一些错误。不过,意识到这个问题就可以在程序中妥善处理。

编写程序时,要认真设计用户界面。事先预料一些用户可能犯得错误,然后设计程序妥善的处理这些错位情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值