C语言餐饮订单系统问题:旧订单被覆盖,搜索仅识别最新条目
餐饮订单系统问题修复
核心问题分析
- 新订单"被覆盖"的假象:并非真的覆盖,而是列表功能遍历了整个100长度的数组(包括未录入的空订单),同时搜索逻辑错误修改了全局
codigo变量,导致后续订单索引混乱。 - 搜索功能失效:搜索时拿全局递增的
codigo和输入值对比,还在循环里持续递增codigo,完全没有正确匹配每个订单的编号。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define TAM 100 typedef struct order { int codigo; // 给每个订单绑定独立编号 char nome[50]; char endereco[150]; char pedido[300]; char valor[10]; } Order; // 补充结构体别名,简化使用 int main() { Order lista[TAM]; int busca, acha, i, menu; int total_pedidos = 0; // 记录已录入的订单总数 int proximo_codigo = 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); fflush(stdin); switch(menu) { case 1: if(total_pedidos >= TAM) { printf("Limite de pedidos atingido!\n"); system("pause"); break; } system("cls"); // 给当前订单分配唯一编号 lista[total_pedidos].codigo = proximo_codigo; printf("Digite seu nome: \n"); scanf("%49[^\n]", lista[total_pedidos].nome); fflush(stdin); printf("Digite seu endereco: \n"); scanf("%149[^\n]", lista[total_pedidos].endereco); fflush(stdin); printf("Digite seu pedido: \n"); scanf("%299[^\n]", lista[total_pedidos].pedido); fflush(stdin); printf("Digite o valor total: \n"); scanf("%9[^\n]", lista[total_pedidos].valor); fflush(stdin); system("cls"); printf("Codigo: %d\n", lista[total_pedidos].codigo); printf("Nome: %s\n", lista[total_pedidos].nome); printf("Endereco: %s\n", lista[total_pedidos].endereco); printf("Pedido: %s\n", lista[total_pedidos].pedido); printf("Valor total: %s\n", lista[total_pedidos].valor); system("pause"); total_pedidos++; proximo_codigo++; break; case 2: system("cls"); printf("Insira o codigo que deseja buscar:\n"); scanf("%d", &busca); fflush(stdin); acha = 0; // 遍历已录入的订单,逐个匹配编号 for(i = 0; i < total_pedidos; i++) { if(lista[i].codigo == busca) { acha = 1; printf("=============================\n"); printf("Codigo: %d\n", lista[i].codigo); 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_pedidos == 0) { printf("Nenhum pedido cadastrado!\n"); system("pause"); break; } // 只遍历已录入的有效订单 for(i = 0; i < total_pedidos; i++){ printf("=============================\n"); printf("Codigo: %d\n", lista[i].codigo); 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; }
关键修改点说明
- 结构体新增
codigo字段:让每个订单拥有独立编号,不再依赖全局变量,从根源解决搜索匹配错误的问题。 - 新增
total_pedidos变量:记录已录入订单数量,列表和搜索时只遍历有效订单,避免显示空数据,也防止越界访问。 - 修复搜索逻辑:遍历有效订单列表,逐个对比订单的
codigo和输入值,找到匹配项后立即停止遍历。 - 修复录入逻辑:用
total_pedidos作为当前订单的索引,不再用全局i,避免被其他逻辑修改导致索引混乱。 - 增加边界判断:录入时检查是否达到订单上限,列表时检查是否有订单,提升程序健壮性。
- 保留
fflush(stdin):按照要求保留所有输入后的刷新操作,避免输入异常。
内容的提问来源于stack exchange,提问作者Scuttler
相关产品推荐
相关产品推荐

