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; }
关键修复点说明
- 初始化索引变量:新增
current_index和total_orders,分别记录当前新增订单的索引和已创建订单总数,彻底避免数组越界问题。 - 修复查询逻辑:遍历已创建的订单,通过订单索引(即编号)匹配查询值,不再修改全局变量,杜绝数据覆盖和混乱。
- 替换
fflush(stdin):自定义clear_input_buffer函数,安全清除输入缓冲区的换行符,避免scanf读取异常。 - 边界检查:新增订单时判断是否达到数组上限,显示所有订单时仅遍历已创建的订单,避免空元素输出。
内容的提问来源于stack exchange,提问作者Scuttler
相关产品推荐
相关产品推荐

