You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:52:34