C++中大写字母为何会影响字符串比较(姓名排序场景)?
问题背景
- 我是正在学习C的新手,目前跟着本贾尼·斯特劳斯特鲁普所著的《C程序设计原理与实践(第2版)》完成配套练习。为了不超前接触书本后续章节的知识点,我只用已经掌握的if判断、大小比较运算符实现三个姓名的排序逻辑。
- 多轮测试后我遇到了异常现象:当输入的姓名包含大写字母时,排序结果经常不符合预期,和我认知里的常规字母表顺序不一致。
实现代码
string name1, name2, name3; cout << "Enter three names : \n"; cin >> name1 >> name2 >> name3; if (name1 > name2) { string temp; temp = name2; name2 = name1; name1 = temp; } if (name2 > name3) { string temp; temp = name3; name3 = name2; name2 = temp; } if (name1 > name2) { string temp; temp = name2; name2 = name1; name1 = temp; } cout << "In alphabetical order : \n" << name1 << '\n' << name2 << '\n' << name3;
异常原因说明
- C++标准库中
string的大小比较规则,是逐位对比两个字符串每个字符对应的ASCII编码值,编码值更小的字符串,会被判定为“更小”,在升序排序时排在前面。 - 通用ASCII编码的取值规则为:大写英文字母(A-Z)的编码范围是6590,小写英文字母(a-z)的编码范围是97122,所有大写字母的编码值都比同字母的小写形式小32。
- 这种编码规则和人直觉上的“字母表顺序”存在差异:比如对比"apple"和"Bob"两个字符串,程序会因为首字符'B'的编码值(66)远小于'a'的编码值(97),判定"Bob"比"apple"更小,将"Bob"排在排序结果的最前面。最终实际排序效果就是:所有以大写字母开头的姓名,都会排在纯小写字母开头的姓名前面,和预期结果不符。
内容的提问来源于stack exchange,提问作者Chrisplusian
相关产品推荐
相关产品推荐

