-3

我正在调试的程序此时正在接收 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在执行大小写转换之前将其转换为。但是,即使我做错了,我也不明白它为什么会崩溃。

toupperSIGINT 崩溃的原因是什么?我怎样才能避免一些用户输入可以到我的服务器应用程序?

4

1 回答 1

2

UTF-8 使用的数字在被视为有符号字符时会显示为负数(这很常见)。将这些负数toupper赋予未定义的行为。

尝试:

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

...看看情况是否好转。

于 2013-10-16T03:12:15.100 回答