一个逗号引发的崩溃

在程序退出时总提示'5.1' is not a valid integervalue,的错误,单步调试发现StrtoFloatDef出错,

StrtoFloatDef('5.1')。后来发现windows的数字分割符是有区域问题的,一般中国都是点号,美国是用逗号。

英文这个软件会有英文版,为了统一,

在程序初始化时,指定 DecimalSeparator := '.';//指定数字的分割符为点号。


来自东子的博客


# 题目重述 给定两个正整数,求它们的最大公约数。 输入示例:`6 9` 期望输出:`3` 你已意识到逗号的问题,但即使修改后仍报错。我们来深入分析 **为什么还是错的**。 --- # 详解 你说:“我逗号是对的”,但程序仍然出错 —— 很可能是因为以下几个**隐蔽问题**: ### ❌ 问题 1:看似英文逗号,实则是中文全角符号(最常见) 你在代码中写了: ```c scanf("%d,%d", &a, &b); ``` 你以为这是英文逗号,但如果从某些编辑器(如 Word、微信、手机输入法)复制过来,可能会插入**视觉上相似但编码不同的全角字符**。 👉 如何检查? - 将 `","` 复制进十六进制编辑器或用编程判断其 ASCII 值 - 英文逗号 `,` 的 ASCII 是 `0x2C` - 中文全角逗号 `,` 的 Unicode 是 `U+FF0C`,不是合法语法 ✅ 解决方法: > 删除原逗号,手动在英文输入法下按键盘 `,` 键重新输入! --- ### ❌ 问题 2:输入格式与实际不符 你的输入如果是这样: ``` 6 9 ``` (用空格分隔) 但 `scanf` 写成: ```c scanf("%d,%d", &a, &b); ``` 这就要求用户输入: ``` 6,9 ``` 否则无法匹配,导致读取失败,`a` 和 `b` 未初始化 → 后续计算出错 🔧 建议方案一(推荐):改用空格分隔 ```c scanf("%d %d", &a, &b); // 接受 "6 9" ``` 或者要求用户输入带英文逗号: ``` 6,9 ``` --- ### ❌ 问题 3:变量未初始化或逻辑路径遗漏 观察原始代码结构: ```c if(a <= b){ ... } else { ... } ``` 虽然覆盖了两种情况,但在极端情况下(比如 `a == b`)应该直接输出即可。不过这不是 runtime error 主因。 更大的风险是:如果 `a` 或 `b` 没有被正确读入(因为 `scanf` 失败),则它们的值是**未定义的垃圾值**,进入循环就会访问非法内存或陷入无限循环。 这就是 Runtime Error 的根本来源之一。 --- ### ✅ 正确且健壮的代码应如下: ```c #include<stdio.h> int main() { int a, b, temp; scanf("%d %d", &a, &b); // 使用空格,避免逗号陷阱 while (b != 0) { temp = b; b = a % b; a = temp; } printf("%d\n", a); return 0; } ``` --- # 知识点 1. **`scanf` 对格式字符串敏感** 必须确保分隔符与输入完全一致,包括字符编码(ASCII vs Unicode) 2. **全角与半角字符不可混用** 视觉相同≠功能相同,全角标点会导致语法解析失败 3. **未初始化变量导致未定义行为** `scanf` 失败后变量随机值,引发崩溃或错误结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值