如何实现点餐系统循环中ID自增?当前ID显示固定异常值
点餐系统ID自增问题修复
核心问题分析
- 变量未初始化:
c声明时未赋值,直接执行c = c + 1会读取内存随机值,逻辑完全混乱。 - 错误打印内存地址:输出ID时用了
&c,这是取变量c的内存地址,而非变量本身的值,所以每次显示的都是固定的地址数值(比如你看到的6684076)。 - 冗余结构体定义:每次循环定义
R1、R2、R3、R4四个结构体,其实一个结构体就能存全订单信息,没必要拆分。 - 不安全输入函数:
gets已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets。 - 未定义行为的
fflush(stdin):fflush仅对输出流有效,刷新输入流属于未定义行为,不同编译器处理结果不一致。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct res { char nome[40]; char endereco[100]; char pedido[200]; char valor[20]; }; int main() { int cod = 0; // 初始化订单ID计数器 int pedido_id = 0; while (cod < 100) { cod++; pedido_id++; struct res pedido_atual; printf("Digite seu nome: "); // 用fgets替代gets,同时去除输入末尾的换行符 fgets(pedido_atual.nome, sizeof(pedido_atual.nome), stdin); pedido_atual.nome[strcspn(pedido_atual.nome, "\n")] = '\0'; printf("Digite seu endereco: "); fgets(pedido_atual.endereco, sizeof(pedido_atual.endereco), stdin); pedido_atual.endereco[strcspn(pedido_atual.endereco, "\n")] = '\0'; printf("Digite seu pedido: "); fgets(pedido_atual.pedido, sizeof(pedido_atual.pedido), stdin); pedido_atual.pedido[strcspn(pedido_atual.pedido, "\n")] = '\0'; printf("Digite o valor total que vai pagar: "); fgets(pedido_atual.valor, sizeof(pedido_atual.valor), stdin); pedido_atual.valor[strcspn(pedido_atual.valor, "\n")] = '\0'; system("cls"); // 直接打印计数器变量值,而非地址 printf("Codigo: %d\n", pedido_id); printf("Nome: %s\n", pedido_atual.nome); printf("Endereco: %s\n", pedido_atual.endereco); printf("Pedido: %s\n", pedido_atual.pedido); printf("Valor: %s\n", pedido_atual.valor); } return 0; }
关键修改点
- 新增初始化的
pedido_id作为订单ID计数器,每次循环自增1。 - 打印ID时直接使用变量名,移除取地址符
&。 - 用
fgets替代gets,并通过strcspn处理输入末尾的换行符。 - 改用单个结构体存储订单信息,简化代码逻辑。
- 删除了未定义行为的
fflush(stdin)。
内容的提问来源于stack exchange,提问作者Scuttler
相关产品推荐
相关产品推荐

