第14章 结构和其他数据形式 14.4 结构数组
2017-03-14 00:00
489 查看
程序清单14.2 manybook.c程序
首先,我们看看如何声明结构数组以及如何访问各个成员。然后,我们着重分析程序的两个方面。
14.4.1 声明结构数组
声明一个结构数组和声明其他类型的数组一样:
这条语句声明library为一个具有MAXBKS个元素的数组,数组 的每个元素都是book类型的结构。
library本身不是结构名,它是元素类型为struct book结构的数组名。
14.4.2 标识结构数组成员
为了标识结构数组的成员,可以采用适用于各个结构的规则:在结构名后加一个点运算符,然后是成员名。
使用library[0].value的原因是library[0]是结构变量名,就像library[4]是另一个结构变量名一样;
library[2].title[4];这个表达式代表什么?
这是由第3 个结构描述的书本的名称的第5个字符。这个例子指出,点运算符右边的下标作用于各个成员,点运算符左边的下标作用于结构数组。
作为结构,我们看下面的这个序列:
14.4.3 程序讨论
相对于第一个程序的主要变化是,我们插入一个循环来读取多个输入项,循环是由下列的while条件开始的:
表达式gets(library[count].title)读入一个字符串作为书名;如果gets()试图超出文件结尾读取字符,这个表达式的值为NULL。表达式library[count].title[0]!='\0'是检测字符串的第一个字符是否为空字符,也就是字符串是否为空。如果用户在输入行的开始就按了回车键,将输入空字符串,这将结束循环。我们还进行限制,以确保输入的书本数不超出数组大小的限制。
程序中有这们的几行:
在前面的章节我们介绍过,scanf()函数忽略掉空格和换行符,这段代码弥补了这一不足。当您回答对书本价格的请求时,您可能会键入下列的信息:
12.5[enter]
这个语句传送了下面的字符序列:
12.50 \n
scanf()函数读入了1、2、5、0,但是把\n留在了输入流中,等待下一个读入语句处理。如果没有前面那段预处理的代码,下一个读入语句gets(library[count].title)就会把留下来的换行符当作空行读入,程序会以为用户发出了一个停止信号。我们插入的那段代码会把后续所有字符丢掉,直到发现并丢掉一个换行符为止。除了把这些字符丢掉以外,它不会对它们进行任何处理。这样gets就可以重新开始 了。
/*manybook.c 包含多本书的图书目录*/ #include <stdio.h> #define MAXTITL 40 #define MAXAUTL 40 #define MAXBKS 100 /*最多可以容纳的图书册数*/ struct book { /*结构模板;标记为book*/ char title[MAXTITL]; char author[MAXAUTL]; float value; }; /*结构模板结束*/ int main(void) { struct book library[MAXBKS]; /*把library声明为book结构数组*/ int count=0; int index; printf("Please enter the book title.\n"); printf("Please [enter] at the start of a line to stop.\n"); while(count<MAXBKS && gets(library[count].title)!=NULL && library[count].title[0]!='\0') { printf("Now enter the author.\n"); gets(library[count].author); printf("Now enter the value.\n"); scanf("%f",&library[count++].value); while(getchar()!='\n') continue; /*清空输入行*/ if(count<MAXBKS) printf("Enter the next title.\n"); } if(count>0) { printf("Here is the list of your books: \n"); for(index=0;index<count;index++) printf("%s by %s: $%.2f\n",library[index].title, library[index].author,library[index].value); } else printf("No books? Too bad.\n"); return 0; }
首先,我们看看如何声明结构数组以及如何访问各个成员。然后,我们着重分析程序的两个方面。
14.4.1 声明结构数组
声明一个结构数组和声明其他类型的数组一样:
struct book library[MAXBKS];
这条语句声明library为一个具有MAXBKS个元素的数组,数组 的每个元素都是book类型的结构。
library本身不是结构名,它是元素类型为struct book结构的数组名。
14.4.2 标识结构数组成员
为了标识结构数组的成员,可以采用适用于各个结构的规则:在结构名后加一个点运算符,然后是成员名。
library[0].value; /*第1个数组元素的value成员*/ library[4].title; /*第5个数组元素的title成员*/
使用library[0].value的原因是library[0]是结构变量名,就像library[4]是另一个结构变量名一样;
library[2].title[4];这个表达式代表什么?
这是由第3 个结构描述的书本的名称的第5个字符。这个例子指出,点运算符右边的下标作用于各个成员,点运算符左边的下标作用于结构数组。
作为结构,我们看下面的这个序列:
library //book结构数组 library[2] //数组元素,因此是一个book结构 library[2].title //char数组(library[2]的title成员) library[2].title[4] //title成员数组中的一个字符
14.4.3 程序讨论
相对于第一个程序的主要变化是,我们插入一个循环来读取多个输入项,循环是由下列的while条件开始的:
while(count<MAXBKS && gets(library[count].title)!=NULL && library[count].title[0]!='\0')
表达式gets(library[count].title)读入一个字符串作为书名;如果gets()试图超出文件结尾读取字符,这个表达式的值为NULL。表达式library[count].title[0]!='\0'是检测字符串的第一个字符是否为空字符,也就是字符串是否为空。如果用户在输入行的开始就按了回车键,将输入空字符串,这将结束循环。我们还进行限制,以确保输入的书本数不超出数组大小的限制。
程序中有这们的几行:
while(getchar()!='\n') continue; /*清空输入行*/
在前面的章节我们介绍过,scanf()函数忽略掉空格和换行符,这段代码弥补了这一不足。当您回答对书本价格的请求时,您可能会键入下列的信息:
12.5[enter]
这个语句传送了下面的字符序列:
12.50 \n
scanf()函数读入了1、2、5、0,但是把\n留在了输入流中,等待下一个读入语句处理。如果没有前面那段预处理的代码,下一个读入语句gets(library[count].title)就会把留下来的换行符当作空行读入,程序会以为用户发出了一个停止信号。我们插入的那段代码会把后续所有字符丢掉,直到发现并丢掉一个换行符为止。除了把这些字符丢掉以外,它不会对它们进行任何处理。这样gets就可以重新开始 了。
相关文章推荐
- 第14章 结构和其他数据形式 14.18 编程练习
- C primer plus第14章(结构和其他数据形式)(练习)
- c primer plus第14章总结:结构和其他数据形式
- 第14章 结构和其他数据形式 14.10 联合简介
- 第14章 结构和其他数据形式 14.3 定义结构变量
- 第14章 结构和其他数据形式 14.7 向函数传递结构信息
- 第14章 结构和其他数据形式 14.11 枚举类型
- 第14章 结构和其他数据形式 14.8 把结构内容保存到文件中
- 第14章 结构和其他数据形式 14.2 建立结构声明
- 第14章 结构和其他数据形式 14.12 typedef 简介
- C primer plus第14章(结构和其他数据形式)
- 第14章 结构和其他数据形式 14.5 嵌套结构
- 第14章 结构和其他数据形式 14.13 奇特的声明
- 第14章 结构和其他数据形式 14.6 指向结构的指针
- 结构和其他数据形式 结构数组
- 第14章 结构和其他数据形式 14.9 结构下一步是什么
- 第14章 结构和其他数据形式 14.1 示例问题:创建图书目录
- 第14章 结构和其他数据形式 14.14 函数和指针
- C Primer+Plus(十四)结构和其他数据形式
- C Primer Plus5(十四)结构和其他数据形式