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

字符串倒数第二个元素获取及社保号性别校验代码异常排查

社保号性别判断代码问题排查与修复

需求与问题现象

需求:通过社保号的倒数第二个数字判断性别,偶数对应女性(用K表示,瑞典语kvinna),奇数对应男性(用M表示)。

原C++代码运行结果时对时错,测试用例如下:

输入实际输出预期输出结果
8602024898MM正确
8510309159KM错误
7102022980MK错误
4906147410MM正确

原代码片段:

char check_gender(string person_nummer){
    int check_digit = (person_nummer.back() - 1) - '0'; 
    char gender; 
    if(check_digit % 2 == 0){
        gender = 'K';     // K for a women(kvinna in swedish)
    }
    else{
        gender = 'M';     // M for man
    }
    return gender;
}
int main(){
  string number; 
  cout << "enter number" << endl; 
  cin >> number; 
  cout << check_gender(number) << endl; 
  return 0; 
}

错误原因分析

核心错误在于获取倒数第二个元素的方式完全错误:

  • person_nummer.back()返回的是字符串的最后一个字符,对其执行-1操作是将该字符的ASCII值减1,而非获取倒数第二个元素。
  • 例如输入8510309159,最后一个字符是'9'(ASCII码57),57-1=56对应字符'8',转成数字是8(偶数),所以返回K,但实际倒数第二个数字是5(奇数),应该返回M,导致结果错误。

修正后的代码

#include <string>
#include <iostream>
using namespace std;

char check_gender(string person_nummer){
    // 先判断字符串长度是否合法(至少2位)
    if(person_nummer.size() < 2){
        // 返回特殊字符表示无效输入
        return '?';
    }
    // 正确获取倒数第二个字符并转换为数字
    int check_digit = person_nummer[person_nummer.size() - 2] - '0'; 
    char gender; 
    if(check_digit % 2 == 0){
        gender = 'K';     // K for kvinna (female)
    }
    else{
        gender = 'M';     // M for man (male)
    }
    return gender;
}

int main(){
  string number; 
  cout << "enter number" << endl; 
  cin >> number; 
  cout << check_gender(number) << endl; 
  return 0; 
}

正确获取字符串倒数第二个元素的方法

在C++中,有几种安全的方式获取字符串的倒数第二个元素(前提是字符串长度≥2):

  • 索引访问:str[str.size() - 2],直接通过长度计算索引,最直观常用。
  • 迭代器访问:*(str.end() - 2),end()返回指向末尾的迭代器,减2后指向倒数第二个元素,解引用获取值。
  • C++11及以上:*(prev(str.end(), 2)),prev函数可以将迭代器向前移动指定步数,这里移动2步从末尾到倒数第二个元素。

注意:使用前必须确保字符串长度至少为2,否则会触发越界访问,导致未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:30:47