|
发表于 2023-11-28 06:06:16
|
显示全部楼层
当优化这段代码时,你可以考虑以下几个方面:
1. 使用`fgets`函数代替`scanf`函数:`scanf`函数在处理字符串输入时存在一些安全性问题。为了避免缓冲区溢出问题,建议使用`fgets`函数来获取字符串输入。你可以定义一个较大的字符数组,并使用`fgets`函数将用户输入的字符串存储到该数组中。
2. 添加输入验证:在输入图书信息时,可以添加一些验证步骤来确保输入的有效性。例如,对售价和出版日期进行范围验证,以及检查字符串长度是否超过预定限制等。
3. 将字符串变量改为指针:在结构体中,将字符串变量改为字符指针,并使用动态内存分配函数(如`malloc`)动态分配内存来存储字符串。这样可以避免固定长度的字符数组带来的限制。
4. 使用函数封装代码:将输入和输出部分封装成函数,提高代码的可读性和可维护性。例如,编写一个函数用于输入图书信息,另一个函数用于输出图书信息。
5. 使用合适的数据类型:根据实际需要选择合适的数据类型来存储图书信息。例如,价格可能更适合使用`double`类型而不是`float`类型。
以下是一个参考的优化示例代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define MAX_LENGTH 100
- struct Book{
- char* title;
- char* author;
- double price;
- unsigned int date;
- char* publisher;
- };
- void inputBookInfo(struct Book* book){
- char buffer[MAX_LENGTH];
-
- printf("请输入书名:");
- fgets(buffer, sizeof(buffer), stdin);
- book->title = malloc(strlen(buffer) + 1);
- strcpy(book->title, buffer);
- printf("请输入作者:");
- fgets(buffer, sizeof(buffer), stdin);
- book->author = malloc(strlen(buffer) + 1);
- strcpy(book->author, buffer);
- printf("请输入售价:");
- scanf("%lf", &book->price);
- printf("请输入出版日期:");
- scanf("%u", &book->date);
- getchar(); // 读取多余的换行符
- printf("请输入出版社:");
- fgets(buffer, sizeof(buffer), stdin);
- book->publisher = malloc(strlen(buffer) + 1);
- strcpy(book->publisher, buffer);
- }
- void outputBookInfo(const struct Book* book){
- printf("\n===数据录入完毕===\n\n");
- printf("书名:%s", book->title);
- printf("作者:%s", book->author);
- printf("售价:%.2lf\n", book->price);
- printf("出版日期:%u\n", book->date);
- printf("出版社:%s", book->publisher);
- }
- void freeBookInfo(struct Book* book){
- free(book->title);
- free(book->author);
- free(book->publisher);
- }
- int main(){
- struct Book book;
- inputBookInfo(&book);
- outputBookInfo(&book);
- freeBookInfo(&book);
- return 0;
- }
复制代码
希望这些优化建议对你有帮助!如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 |
|