C语言提取字符串中商品价格结果错误,有什么更优实现方案?
价格计算错误的原因
- 第一个核心错误在
getprice函数的第一层循环:for循环本身每次迭代会自动执行i++,你又在循环体内额外加了一次i++,相当于每轮循环i递增2,根本找不到正确的数字起始位置,大概率会跳过第一个数字字符。 - 第二个错误是提取价格的循环没有做数字合法性判断:找到第一个数字后,后续所有字符(包括输入末尾的换行符、空格等非数字字符)都被强制减去
'0'参与计算,再加上你用%u(无符号整数)输出负数结果,最终就会得到262这类异常值。 - 现有拆分逻辑的鲁棒性很差:靠遍历判断字符的方式很容易因为输入格式的微小偏差出问题,比如商品名里带数字、分隔符格式变化都会导致结果错误。
更简单可靠的实现方案
直接用C标准库的字符串查找函数定位分隔符" - ",直接拆分商品名和价格两部分,逻辑清晰不容易出错,参考实现代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char item[40]; // 读取输入,替换fgets保留的末尾换行符为结束符 fgets(item, 40, stdin); item[strcspn(item, "\n")] = '\0'; // 查找分隔符 " - " 的位置 char *sep = strstr(item, " - "); if (sep == NULL) { printf("输入格式错误\n"); return 1; } // 拆分字符串:sep前面是商品名,sep+3(" - "长度为3)后面是价格部分 *sep = '\0'; int price = atoi(sep + 3); // 按要求输出 printf("Item: %s\n", item); printf(" Price: %d\n", price); return 0; }
- 该实现直接依赖标准库函数做字符串拆分,不需要自己手写遍历逻辑,出错概率低
- 自动处理输入末尾的换行符,不会参与价格计算
- 输入格式不对时会给出错误提示,鲁棒性更强
内容的提问来源于stack exchange,提问作者braindead_
相关产品推荐
相关产品推荐

