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

C语言餐饮订单系统问题:旧订单被覆盖,搜索仅识别最新条目

餐饮订单系统问题修复

核心问题分析

  1. 新订单"被覆盖"的假象:并非真的覆盖,而是列表功能遍历了整个100长度的数组(包括未录入的空订单),同时搜索逻辑错误修改了全局codigo变量,导致后续订单索引混乱。
  2. 搜索功能失效:搜索时拿全局递增的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:18