1、基于顺序存储结构的图书信息表的创建和输出
描述
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。
输入
输入n+1行,其中前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计n+1行,第1行是所创建的图书表中的图书个数,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
输入样例 1
9787302257646 Data-Structure 35.00 9787302164340 Operating-System 50.00 9787302219972 Software-Engineer 32.00 9787302203513 Database-Principles 36.00 9787810827430 Discrete-Mathematics 36.00 9787302257800 Data-Structure 62.00 9787811234923 Compiler-Principles 62.00 9787822234110 The-C-Programming-Language 38.00 0 0 0
输出样例 1
8 9787302257646 Data-Structure 35.00 9787302164340 Operating-System 50.00 9787302219972 Software-Engineer 32.00 9787302203513 Database-Principles 36.00 9787810827430 Discrete-Mathematics 36.00 9787302257800 Data-Structure 62.00 9787811234923 Compiler-Principles 62.00 9787822234110 The-C-Programming-Language 38.00
#include <stdio.h>
#include <string.h>
#define MAX_BOOKS 100
// 定义图书信息结构体
typedef struct {
char book_id[50];
char book_name[100];
float price;
} Book;
int main() {
Book library[MAX_BOOKS];
int book_count = 0;
// 读取图书信息
while (1) {
char id[50];
char name[100];
float price;
scanf("%s %s %f", id, name, &price);
// 检查是否到达输入结束标志
if (strcmp(id, "0") == 0 && strcmp(name, "0") == 0 && price == 0.0) {
break;
}
// 存储图书信息
strcpy(library[book_count].book_id, id);
strcpy(library[book_count].book_name, name);
library[book_count].price = price;
book_count++;
}
// 输出图书总数
printf("%d\n", book_count);
// 输出每本图书的信息
for (int i = 0; i < book_count; i++) {
printf("%s %s %.2f\n", library[i].book_id, library[i].book_name, library[i].price);
}
}
2、strcmp
strcmp是string compare(字符串比较)的缩写,它是一个用于比较两个字符串并根据比较结果返回整数的函数。以下是对strcmp函数的详细解释:
1、基本形式与功能
strcmp函数的基本形式为strcmp(str1, str2),其中str1和str2是需要比较的两个字符串。该函数的功能是比较这两个字符串的字典序关系,并返回一个整数值来表示比较结果。
2、返回值规则
- 若str1等于str2,则返回0。
- 若str1在字典序上小于str2,则返回一个负整数。具体来说,当str1的第一个与str2不同的字符的ASCII码值小于str2的对应字符的ASCII码值时,返回负整数。
- 若str1在字典序上大于str2,则返回一个正整数。具体来说,当str1的第一个与str2不同的字符的ASCII码值大于str2的对应字符的ASCII码值时,返回正整数。
需要注意的是,虽然某些实现(如VC)在str1小于str2时返回-1,在str1大于str2时返回1,但C标准只规定了返回值为正数、负数或0,并未具体规定是1或-1。因此,不应依赖这些具体的返回值作为程序中的流程逻辑。
3、strcpy
strcpy
是一个在 C 语言中常用的标准库函数,用于复制字符串。它的全称是 "string copy"。这个函数会将源字符串(source string)复制到目标字符串(destination string)中,直到遇到源字符串的结束符 '\0'(空字符),然后会在目标字符串的末尾也添加一个结束符 '\0'。
函数原型如下:
char *strcpy(char *dest, const char *src);
dest
是目标字符串的指针,即复制操作的结果将存储在这里。
src
是源字符串的指针,即从这个字符串复制内容。
使用 strcpy
时需要注意以下几点:
-
目标空间足够:确保目标字符串
dest
有足够的空间来存储源字符串src
的内容,包括结束符 '\0'。如果目标空间不足,将会导致缓冲区溢出(buffer overflow),这是常见的安全漏洞之一。 -
目标字符串未初始化:
strcpy
不会检查目标字符串dest
是否已经初始化或包含数据。它会直接覆盖dest
指向的内存区域。 -
返回值:
strcpy
返回目标字符串dest
的指针。 -
重叠内存:如果源字符串和目标字符串的内存区域重叠,
strcpy
的行为是未定义的。在这种情况下,应使用memmove
而不是strcpy
。
4、地址操作符(&
):
对于非指针类型的变量(如int
、float
、double
等),你需要使用地址操作符&
来获取该变量的地址。scanf
需要变量的地址来将输入的数据存储到正确的内存位置。price
应该是一个浮点型变量(如float
或double
),&price
就是获取price
变量的地址。