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

如何解决C++波兰姓名性别识别程序触发的'__pos <= size()'断言失败问题

波兰姓名性别识别程序修复指南

报错与逻辑问题根源

  1. 断言越界报错的触发原因
    报错里的__pos <= size()断言,代表访问字符串时使用的下标超出了字符串实际的存储范围。触发原因有三个:

    • 代码里using namespace std行尾漏写分号,导致编译阶段语法异常,后续内存访问逻辑完全失控
    • 没有做空输入兜底:如果用户直接按回车不输入内容,imie的长度为0,此时计算得到的下标dlugosc-1为-1,转成字符串使用的无符号类型下标后会变成一个极大的越界值,直接触发断言
    • 原代码没有主动引入<string>头文件,依赖iostream的间接导入属于未定义行为,不同编译环境下可能直接崩溃
  2. 判断逻辑的硬伤
    原代码里的判断语句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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 02:36:11