将std :: string转换为大写时的SIGINT?

时间:2013-10-16 03:05:41

标签: c++

我正在调试的程序此时正在接收SIGINT:

#0  0x00007ffff590784e in toupper () from /lib/x86_64-linux-gnu/libc.so.6

有问题的代码是:

std::string search = name;
std::transform(search.begin(), search.end(), search.begin(), ::toupper);

现在我不知道内容是什么,但允许使用特殊符号。

我已经知道我在这里做错了,实际上是UTF-8,我应该在执行大小写转换之前将其转换为std::wstring。然而,即使我这样做的方式不对,我也不明白它为什么会崩溃。

toupper因SIGINT而崩溃的原因是什么?我怎样才能避免一些用户输入这个到我的服务器应用程序?

1 个答案:

答案 0 :(得分:2)

UTF-8使用的数字在被视为有符号字符时会显示为负数(这是常见的)。将这些负数提供给toupper会产生不确定的行为。

尝试:

std::transform(search.begin(), search.end(), search.begin(), 
    [](unsigned char ch) {return ::toupper(ch); });

...看看事情是否有所改善。