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

C语言简易收银程序故障求助:输入跳过与计算终止问题

收银程序错误排查及修复

问题分析及修复点

1. 输入缓冲区残留换行,导致Item2输入被跳过

使用scanf读取整数后,用户按下的回车键(\n)会留在输入缓冲区。后续调用fgets时,会直接读取这个换行符,误以为用户已输入Item2名称,从而跳过输入步骤。

修复方法:在每个scanf读取完成后,用循环清空缓冲区中的换行符:

while (getchar() != '\n');

2. scanf读取Cash时缺少取地址符

代码中scanf("%i", Cash);未使用取地址符&,scanf需要接收变量地址来存储输入值,直接传变量值会导致程序访问非法内存,触发崩溃——这就是输入现金后程序终止的核心原因。

修复方法:改为scanf("%i", &Cash);

3. 税费计算的整数截断问题

Tax=Subtotal*0.1;中,Subtotal是整数类型,乘以浮点数0.1后结果会被强制转为整数,导致小数部分丢失(例如Subtotal=55时,55*0.1=5.5会被截断为5)。

修复方法:将Tax改为浮点类型(如float),或计算时四舍五入转为整数:

float Tax = Subtotal * 0.1f;
// 若需整数税费,可四舍五入
int TaxInt = (int)(Tax + 0.5);

4. printf输出时错误使用取地址符

所有printf("%i", &变量)的写法错误,%i格式符需要的是整数变量的值,而非变量地址(&变量是指针),会导致输出错误的地址数值,甚至引发未定义行为。

修复方法:去掉取地址符,直接传变量名,例如printf ("Subtotal: $%i", Subtotal);

修正后的完整代码

/*Cash register*/
#include <stdio.h>
#include <string.h> // 用于strcspn函数

int main () {
  char Item1 [10], Item2 [10];
  int Price1, Price2, Quantity1, Quantity2, Cash, Total1, Total2, Subtotal, Total, Change;
  float Tax; // 改为浮点类型存储税费

  printf ("欢迎来到Sejahtera电子商店\n");
  printf ("请输入您的商品、数量及单价:\n");

  printf("Item 1: ");
  fgets (Item1, 10, stdin);
  // 移除fgets读取的换行符
  Item1[strcspn(Item1, "\n")] = '\0';

  printf("Quantity: ");
  scanf("%i", &Quantity1);
  // 清空缓冲区换行
  while (getchar() != '\n');

  printf("Price: ");
  scanf("%i", &Price1);
  while (getchar() != '\n');

  printf("Item 2: ");
  fgets (Item2, 10, stdin);
  Item2[strcspn(Item2, "\n")] = '\0';

  printf("Quantity: ");
  scanf ("%i", &Quantity2);
  while (getchar() != '\n');

  printf("Price: ");
  scanf ("%i", &Price2);
  while (getchar() != '\n');

  printf ("输入现金:$");
  scanf ("%i", &Cash); // 添加取地址符&

  Total1 = Quantity1 * Price1;
  Total2 = Quantity2 * Price2;
  Subtotal = Total1 + Total2;
  Tax = Subtotal * 0.1f;
  Total = Subtotal + (int)(Tax + 0.5); // 四舍五入得到整数总计
  Change = Cash - Total;

  printf ("\n小计: $%i\n", Subtotal);
  printf ("税费: $%.1f\n", Tax); // 保留一位小数输出税费
  printf ("总计: $%i\n", Total);
  printf ("找零: $%i\n", Change);

  return 0;
}

额外优化说明

  • 用strcspn移除fgets读取到的换行符,避免商品名称末尾带换行影响显示;
  • 税费计算后四舍五入转为整数,确保总计金额准确;
  • 输出时添加换行符,让结果排版更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:10:28