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

C语言订单管理程序新增订单崩溃求助(错误码3221225477)

订单管理程序问题修复方案

问题原因分析

1. 新增订单时程序崩溃(返回3221225477)

变量i在main函数中未初始化,初始值为随机垃圾值。执行lista[i].nome时,i可能超出数组lista的合法索引范围(0~99),触发数组越界访问,导致程序内存错误崩溃。

2. 查询订单功能逻辑错误(数据覆盖、查询失效)

  • 查询模块错误修改全局变量codigo,导致后续新增订单的编号混乱,且匹配逻辑完全错误(用当前全局codigo和输入值比较,而非遍历订单编号)。
  • 未维护已创建订单的计数,显示所有订单时遍历整个数组(包括未初始化的空元素),编号逻辑混乱。
  • fflush(stdin)属于未定义行为,部分编译器无法正确清除输入缓冲区的换行符,可能导致后续scanf读取异常。

修复后的完整代码

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

#define TAM 100

struct order
{
    char nome[50];
    char endereco[150];
    char pedido[300];
    char valor[10];
};

// 清除输入缓冲区换行符,替代未定义行为的fflush(stdin)
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

int main() 
{
    struct order lista[TAM];
    int busca, acha, menu;
    int current_index = 0; // 当前新增订单的索引,初始化为0
    int total_orders = 0;  // 已创建订单的总数
    menu = 0;

    while(menu != 4)
    {
        system("cls");

        printf("====================\n");
        printf("Selecione uma opcao\n");
        printf("====================\n");
        printf("1 - Cadastrar pedido\n");
        printf("2 - Consultar pedido\n");
        printf("3 - Emitir relatorio\n");
        printf("4 - Sair\n");
        scanf("%d", &menu);
        clear_input_buffer();

        switch(menu)
        {
            case 1:
                if (total_orders >= TAM) {
                    system("cls");
                    printf("Limite de pedidos atingido!\n");
                    system("pause");
                    break;
                }
                system("cls");

                printf("Digite seu nome: \n");
                scanf("%49[^\n]", lista[current_index].nome);
                clear_input_buffer();

                printf("Digite seu endereco: \n");
                scanf("%149[^\n]", lista[current_index].endereco);
                clear_input_buffer();

                printf("Digite seu pedido: \n");
                scanf("%299[^\n]", lista[current_index].pedido);
                clear_input_buffer();

                printf("Digite o valor total: \n");
                scanf("%9[^\n]", lista[current_index].valor);
                clear_input_buffer();

                system("cls");

                printf("Codigo: %d\n", current_index);
                printf("Nome: %s\n", lista[current_index].nome);
                printf("Endereco: %s\n", lista[current_index].endereco);
                printf("Pedido: %s\n", lista[current_index].pedido);
                printf("Valor total: %s\n", lista[current_index].valor);
                system("pause");

                current_index++;
                total_orders++;
                break;

            case 2:
                system("cls");

                printf("Insira o codigo que deseja buscar:\n");
                scanf("%d", &busca);
                clear_input_buffer();

                acha = 0;

                // 仅遍历已创建的订单
                for (int i = 0; i < total_orders; i++) {
                    if (i == busca) {
                        acha = 1;
                        printf("=============================\n");
                        printf("Codigo: %d\n", i);
                        printf("Nome: %s\n", lista[i].nome);
                        printf("Endereco: %s\n", lista[i].endereco);
                        printf("Pedido: %s\n", lista[i].pedido);
                        printf("Valor total: %s\n", lista[i].valor);
                        printf("=============================\n");
                        system("pause");
                        break;
                    }
                }

                if (!acha) {
                    printf("\nCodigo nao encontrado\n");
                    system("pause");
                }
                break;

            case 3:
                system("cls");

                if (total_orders == 0) {
                    printf("Nenhum pedido cadastrado!\n");
                    system("pause");
                    break;
                }

                for(int i = 0; i < total_orders; i++){
                    printf("=============================\n");
                    printf("Codigo: %d\n", i);
                    printf("Nome: %s\n", lista[i].nome);
                    printf("Endereco: %s\n", lista[i].endereco);
                    printf("Pedido: %s\n", lista[i].pedido);
                    printf("Valor total: %s\n", lista[i].valor);
                    printf("=============================\n");
                }
                system("pause");
                break;

            case 4:
                return 0;

            default:
                printf("Opcao invalida\n");
                system("pause");
        }
    }

    return 0;
}

关键修复点说明

  1. 初始化索引变量:新增current_index和total_orders,分别记录当前新增订单的索引和已创建订单总数,彻底避免数组越界问题。
  2. 修复查询逻辑:遍历已创建的订单,通过订单索引(即编号)匹配查询值,不再修改全局变量,杜绝数据覆盖和混乱。
  3. 替换fflush(stdin):自定义clear_input_buffer函数,安全清除输入缓冲区的换行符,避免scanf读取异常。
  4. 边界检查:新增订单时判断是否达到数组上限,显示所有订单时仅遍历已创建的订单,避免空元素输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:27:38