C语言结构体程序问题:输入的书名、作者字符串无法显示
问题修复方案
你的代码中字符串无法显示的核心问题是**strcpy参数顺序完全搞反**,另外还有几个影响代码稳定性的细节问题,具体修复步骤如下:
1. 修正strcpy的参数顺序
strcpy的语法是strcpy(目标字符串, 源字符串),你当前写的strcpy(title_1, book_1.title)是把结构体里的空内容复制到临时变量,完全颠倒了数据流向。正确写法应该是把临时变量的内容复制到结构体成员中:
strcpy(book_1.title, title_1);
2. 移除冗余的临时字符数组
你定义的title_1、author_1等临时变量完全没必要,可以直接将输入内容读取到结构体的成员里,既简化代码,也避免参数顺序错误:
// 直接读取到结构体成员 fgets(book_1.title, sizeof(book_1.title), stdin);
3. 替换fflush(stdin)的未定义行为
C标准中fflush(stdin)属于未定义行为,不能用来清除输入缓冲区的换行符。可以在scanf之后用循环读取剩余字符直到换行:
// 清除输入缓冲区的换行符 while (getchar() != '\n');
4. 安全处理fgets的换行符
fgets会把用户输入的换行符也读入字符串,需要判断字符串长度大于0后再替换换行符为\0,避免用户直接按回车导致数组越界:
size_t len = strlen(book_1.title); if (len > 0 && book_1.title[len - 1] == '\n') { book_1.title[len - 1] = '\0'; }
完整修正后的代码
// Exercise N3 - Resource // Structure. #include <stdio.h> #include <string.h> int main() { // Defining Structure. struct Book { char title[40]; char author[40]; float price; }; struct Book book_1; struct Book book_2; struct Book book_3; printf("Hey User !\n"); // First Book Information. printf("Enter first book's information\n"); printf("Book's Title :\n"); fgets(book_1.title, sizeof(book_1.title), stdin); size_t len = strlen(book_1.title); if (len > 0 && book_1.title[len - 1] == '\n') { book_1.title[len - 1] = '\0'; } printf("Book's Author :\n"); fgets(book_1.author, sizeof(book_1.author), stdin); len = strlen(book_1.author); if (len > 0 && book_1.author[len - 1] == '\n') { book_1.author[len - 1] = '\0'; } printf("Book's Price :\n"); scanf("%f", &book_1.price); while (getchar() != '\n'); printf("\n\n"); // Second Book Information. printf("Enter second book's information\n"); printf("Book's Title :\n"); fgets(book_2.title, sizeof(book_2.title), stdin); len = strlen(book_2.title); if (len > 0 && book_2.title[len - 1] == '\n') { book_2.title[len - 1] = '\0'; } printf("Book's Author :\n"); fgets(book_2.author, sizeof(book_2.author), stdin); len = strlen(book_2.author); if (len > 0 && book_2.author[len - 1] == '\n') { book_2.author[len - 1] = '\0'; } printf("Book's Price :\n"); scanf("%f", &book_2.price); while (getchar() != '\n'); printf("\n\n"); // Third Book Information. printf("Enter third book's information\n"); printf("Book's Title :\n"); fgets(book_3.title, sizeof(book_3.title), stdin); len = strlen(book_3.title); if (len > 0 && book_3.title[len - 1] == '\n') { book_3.title[len - 1] = '\0'; } printf("Book's Author :\n"); fgets(book_3.author, sizeof(book_3.author), stdin); len = strlen(book_3.author); if (len > 0 && book_3.author[len - 1] == '\n') { book_3.author[len - 1] = '\0'; } printf("Book's Price :\n"); scanf("%f", &book_3.price); while (getchar() != '\n'); printf("\n\n"); // 找出最贵的书 printf("最贵的图书:\n"); if (book_1.price >= book_2.price && book_1.price >= book_3.price) { printf("Title : %s\n", book_1.title); printf("Author : %s\n", book_1.author); printf("Price : %.2f €\n", book_1.price); } else if (book_2.price >= book_1.price && book_2.price >= book_3.price) { printf("Title : %s\n", book_2.title); printf("Author : %s\n", book_2.author); printf("Price : %.2f €\n", book_2.price); } else { printf("Title : %s\n", book_3.title); printf("Author : %s\n", book_3.author); printf("Price : %.2f €\n", book_3.price); } printf("\n\n"); // 找出最便宜的书 printf("最便宜的图书:\n"); if (book_1.price <= book_2.price && book_1.price <= book_3.price) { printf("Title : %s\n", book_1.title); printf("Author : %s\n", book_1.author); printf("Price : %.2f €\n", book_1.price); } else if (book_2.price <= book_1.price && book_2.price <= book_3.price) { printf("Title : %s\n", book_2.title); printf("Author : %s\n", book_2.author); printf("Price : %.2f €\n", book_2.price); } else { printf("Title : %s\n", book_3.title); printf("Author : %s\n", book_3.author); printf("Price : %.2f €\n", book_3.price); } return 0; }
内容的提问来源于stack exchange,提问作者Fady Saad
相关产品推荐
相关产品推荐

