基于顺序存储结构的图书信息表的创建和输出

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 时需要注意以下几点:

  1. 目标空间足够:确保目标字符串 dest 有足够的空间来存储源字符串 src 的内容,包括结束符 '\0'。如果目标空间不足,将会导致缓冲区溢出(buffer overflow),这是常见的安全漏洞之一。

  2. 目标字符串未初始化strcpy 不会检查目标字符串 dest 是否已经初始化或包含数据。它会直接覆盖 dest 指向的内存区域。

  3. 返回值strcpy 返回目标字符串 dest 的指针。

  4. 重叠内存:如果源字符串和目标字符串的内存区域重叠,strcpy 的行为是未定义的。在这种情况下,应使用 memmove 而不是 strcpy

4、地址操作符(&

对于非指针类型的变量(如intfloatdouble等),你需要使用地址操作符&来获取该变量的地址。scanf需要变量的地址来将输入的数据存储到正确的内存位置。price应该是一个浮点型变量(如floatdouble),&price就是获取price变量的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值