设计程序时,最重要的步骤之一是选择表示数据的方法。C提供了结构变量(structure variable)提供你表示数据的能力,让你创造新的形式。
14.1 示例问题:创建图书目录
Gwen Glem要打印一份图书目录。她想打印每本书的各种信息:书名、作者、出版社、版权日期、页数、册数和价格。其中的一些项目(如,书名)可以存储在字符数组中,其他项目需要一个int数组或float数组。用7个不同的数组分别记录每一项比较繁琐,尤其是Gwen还想创建多份列表:
一份按书名排序、一份按作者排序、一份按价格排序等。如果能把图书目录的信息包含在一个数组里更好,其中每个元素包含一本书的相关信息。
因此,Gwen需要一种既能包含字符串又能包含数字的数据形式,而且还要保持各信息的独立。C结构就满足这种情况下的需求。我们通过一个示例演示如何创建和使用数组。但是,示例进行了一些限制。第一,该程序示例演示的书目只包含书名、作者和价格。第二,只有一本书的书目。
程序清单14.1 book.c程序
//* book.c -- one-book inventory */
#include
#include
char * s_gets(char * st, int n);
#define MAXTITL 41 /* maximum length of title + 1 */
#define MAXAUTL 31 /* maximum length of author's name + 1 */
struct book { /* structure template: tag is book */
char title[MAXTITL];
char author[MAXAUTL];
float value;
}; /* end of structure template */
int main(void)
{
struct book library; /* declare library as a book variable */
printf("Please enter the book title.\n");
s_gets(library.title, MAXTITL); /* access to the title portion */
printf("Now enter the author.\n");
s_gets(library.author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library.value);
printf("%s by %s: $%.2f\n",library.title,
library.author, library.value);
printf("%s: \"%s\" ($%.2f)\n", library.author,
library.title, library.value);
printf("Done.\n");
return 0;
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n'); // look for newline
if (find) // if the address is not NULL,
*find = '\0'; // place a null character there
else
while (getchar() != '\n')
continue; // dispose of rest of line
}
return ret_val;
}
/* 输出:
*/
程序清单14.1中创建的结构有3部分,每个部分都称为成员(member)或字段(field)。这3部分中,一部分存储书名,一部分存储作者名,一部分存储价格。下面是必须掌握的3个技巧:
*为结构建立一个格式或样式;
*声明一个合适样式的变量;
*访问结构变量的各个部分。