字符串倒数第二个元素获取及社保号性别校验代码异常排查
社保号性别判断代码问题排查与修复
需求与问题现象
需求:通过社保号的倒数第二个数字判断性别,偶数对应女性(用K表示,瑞典语kvinna),奇数对应男性(用M表示)。
原C++代码运行结果时对时错,测试用例如下:
| 输入 | 实际输出 | 预期输出 | 结果 |
|---|---|---|---|
| 8602024898 | M | M | 正确 |
| 8510309159 | K | M | 错误 |
| 7102022980 | M | K | 错误 |
| 4906147410 | M | M | 正确 |
原代码片段:
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
相关产品推荐
相关产品推荐

