- 论坛徽章:
- 0
|
“任何复杂问题都有一个简单、整洁而且错误的解决方案。”写关于C++的书的人都喜欢这个类,因为它是
一个好的、简单的例子。 我像其他人一样心虚;我在我的书中多次使用了它。它几乎是正确的,但是不够
好。问题是微妙的。
这里有一个你可以开始发现问题的例子:
int main()
{
const char* s1 = "GEW\334RZTRAMINER";
const char* s2 = "gew\374rztraminer";
printf("s1 = %s, s2 = %s\n", s1, s2);
printf("sl < s2: %s\n",
std::lexicographical_compare(s1, s1 + 14, s2, s2 + 14, lt_nocase())
? "true" :"false");
}
你应该在你的系统上试试看。在我的系统上(一台运行IRIX 6.5的Silicon Graphics O2),这是输出:
s1 = GEWRZTRAMINER, s2 = gewürztraminer
s1< s2: true
噢,多古怪。如果你做忽略大小写比较,难道“gewürztraminer”和“GEWRZTRAMINER”不同吗?现在
做一个轻微的变化:如果你在printf语句之前插入这行
setlocale(LC_ALL, "de");
,突然输出改变了:
s1 = GEWRZTRAMINER, s2 = gewürztraminer
s1 < s2: false
忽略大小写的字符串比较比看起来更复杂。这表面上正确的程序非常依赖于大多数人经常忽略的东西:区域
设置。
区域设置 |
|