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

C语言结构体数组输入异常求助:输入后输出随机内容

问题分析与解决方案

核心问题:输入缓冲区残留换行符干扰程序逻辑

在main函数中用scanf("%d", &n)读取数组大小后,输入缓冲区会残留一个换行符。后续调用cadastrar_eventos里的fgets时,第一个fgets会直接读取这个换行符作为nome的内容,而非等待用户输入的字符串;第二个fgets读取用户输入的第一个字符串(如name),之后的scanf("%d", &p1->dia)尝试读取用户输入的第二个字符串(如event),这会导致读取失败,dia等变量被赋予随机值,最终程序逻辑混乱,提前退出并输出异常内容。

修正方案

1. 清理输入缓冲区残留字符

每次用scanf读取整数后,清空缓冲区中剩余的换行符或其他字符,避免干扰后续fgets的正常读取。

2. 修正enum类型的读取格式

enum mes本质为整数类型,读取时应使用%d而非%u,避免类型不匹配问题。

3. 处理fgets读取的换行符

fgets会将输入时的换行符存入字符串,需手动替换为字符串结束符,避免输出时出现多余换行。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum mes {janeiro=1,fevereiro,marco,abril,maio,junho,julho,agosto,setembro,outubro,novembro,dezembro};

struct data{
    int dias;
    enum mes meis;
    int ano;
};
struct evento{
    char nome [100];
    char local [100];
    int dia;
    enum mes mos;
    int anos;
};

// 清理输入缓冲区残留字符
void limpar_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

void cadastrar_eventos(struct evento agenda[], int n){
    int i;
    struct evento *p1 = agenda;
    for (i=0;i<n;i++){
        printf("Digite o nome do evento %d: ", i+1);
        fgets(p1->nome, 100, stdin);
        // 移除fgets读取的换行符
        p1->nome[strcspn(p1->nome, "\n")] = '\0';
        
        printf("Digite o local do evento %d: ", i+1);
        fgets(p1->local, 100, stdin);
        p1->local[strcspn(p1->local, "\n")] = '\0';
        
        printf("Digite o dia: ");
        scanf("%d", &(p1->dia));
        limpar_buffer();
        
        printf("Digite o mês (1-12): ");
        scanf("%d", (int*)&(p1->mos));
        limpar_buffer();
        
        printf("Digite o ano: ");
        scanf("%d", &(p1->anos));
        limpar_buffer();
        
        p1++;
    }
}

void imprimir_eventos(struct evento agenda[], struct data d, int n){
    int i;
    int count = 0;
    struct evento *p1;
    for (i=0;i<n;i++){
        p1=&agenda[i];
        if (d.dias == agenda[i].dia && d.meis == agenda[i].mos && d.ano == agenda[i].anos){
            printf("Evento encontrado: %s - %s\n", p1->nome, p1->local);
            count++;
        }
    }
    if (count == 0){
        printf("Nenhum evento encontrado!\n");
    }
}

int main (){
    int n;
    struct data hor;
    
    printf("Digite o número de eventos: ");
    scanf("%d", &n);
    limpar_buffer();
    
    struct evento agenda[n];
    cadastrar_eventos(agenda, n);
    
    printf("\nDigite a data para buscar (dia mês ano): ");
    scanf("%d %d %d", &hor.dias, (int*)&hor.meis, &hor.ano);
    limpar_buffer();
    
    imprimir_eventos(agenda, hor, n);
    return 0;
}

关键修改说明

  • 缓冲区清理:新增limpar_buffer函数,每次scanf读取整数后调用,确保后续fgets能正确读取用户输入的字符串。
  • 换行符处理:用strcspn定位fgets读取的换行符,替换为'\0',避免输出时出现多余换行。
  • enum读取修正:将%u改为%d,并将enum变量地址强制转换为int*,保证类型匹配。
  • 交互提示:添加输入提示信息,明确告知用户需要输入的内容,提升操作清晰度。

内容的提问来源于stack exchange,提问作者Gostodexadrez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:35:04