11-程序讨论
14.4.3 程序讨论
较之程序清单14.1,该程序主要的改动之处是:插入一个 while
循环读取多个项。该循环的条件测试是:
while (count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL
&& library[count].title[0] != '\0')
表达式 s_gets(library[count].title, MAXTITL)
读取一个字符串作为书名,如果 s_gets()
尝试读到文件结尾后面,该表达式则返回 NULL
。表达式 library[count].title[0] != '\0'
判断字符串中的首字符是否是空字符(即,该字符串是否是空字符串)。如果在一行开始处用户按下 Enter
键,相当于输入了一个空字符串,循环将结束。程序中还检查了图书的数量,以免超出数组的大小。
然后,该程序中有如下几行:
while (getchar() != '\n')
continue; /* 清理输入行 */
前面章节介绍过,这段代码弥补了 scanf()
函数遇到空格和换行符就结束读取的问题。当用户输入书的价格时,可能输入如下信息:
12.50[Enter]
其传送的字符序列如下:
12.50\n
scanf()
函数接受 1
、 2
、 .
、 5
和 0
,但是把 \n
留在输入序列中。如果没有上面两行清理输入行的代码,就会把留在输入序列中的换行符当作空行读入,程序以为用户发送了停止输入的信号。我们插入的这两行代码只会在输入序列中查找并删除 \n
,不会处理其他字符。这样 s_gets()
就可以重新开始下一次输入。