如何解决C++波兰姓名性别识别程序触发的'__pos <= size()'断言失败问题
波兰姓名性别识别程序修复指南
报错与逻辑问题根源
断言越界报错的触发原因
报错里的__pos <= size()断言,代表访问字符串时使用的下标超出了字符串实际的存储范围。触发原因有三个:- 代码里
using namespace std行尾漏写分号,导致编译阶段语法异常,后续内存访问逻辑完全失控 - 没有做空输入兜底:如果用户直接按回车不输入内容,
imie的长度为0,此时计算得到的下标dlugosc-1为-1,转成字符串使用的无符号类型下标后会变成一个极大的越界值,直接触发断言 - 原代码没有主动引入
<string>头文件,依赖iostream的间接导入属于未定义行为,不同编译环境下可能直接崩溃
- 代码里
判断逻辑的硬伤
原代码里的判断语句if (imie[dlugosc-1]=='a'||'A')是完全无效的写法:C++中逻辑运算不会自动将判断项绑定到同一个变量,这行代码实际等价于
(imie[dlugosc-1] == 'a') || ('A')。单独的字符'A'作为逻辑值时是非零常量,永远为真,所以无论输入什么内容,程序都会直接判定为女性,永远不会走到男性判断的分支。
具体修改项
- 给
using namespace std补上句尾分号 - 主动引入
<string>头文件,避免隐式依赖带来的兼容问题 - 增加空输入校验:检测到用户没有输入有效姓名时直接提示,不执行越界的下标访问
- 修正判断语句,显式比对两种大小写的尾字母,正确写法为
imie[dlugosc-1] == 'a' || imie[dlugosc-1] == 'A' - 将存储字符串长度的变量类型调整为和
length()返回值匹配的size_t,避免有符号、无符号类型转换带来的越界风险
修改后的可运行代码
#include <iostream> #include <string> using namespace std; int main() { string imie; cout << "Podaj imie: "; cin >> imie; // 空输入兜底 if (imie.empty()) { cout << "Nie podano imienia" << endl; return 0; } size_t dlugosc = imie.length(); if (imie[dlugosc - 1] == 'a' || imie[dlugosc - 1] == 'A') { cout << "Jestes kobieta" << endl; } else { cout << "Jestes mezczyzna" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者grek643
相关产品推荐
相关产品推荐

