【发布时间】:2017-02-26 14:57:58
【问题描述】:
我一直在尝试使用不同的语言环境调用std::tolower(),但似乎出了点问题。我的代码如下:
int main() {
std::locale::global(std::locale("es_ES.UTF-8"));
std::thread(&function, this); // Repeated some times
// wait for threads
}
void function() {
std::string word = "HeÉllO";
std::transform(word.begin(), word.end(), word.begin(), cToLower);
}
int cToLower(int c) {
return std::tolower(c, std::locale());
}
所以当我尝试执行这个程序时,我得到:
terminate called after throwing an instance of 'std::bad_cast'
terminate called recursively
what(): std::bad_cast
Aborted (core dumped)
虽然执行 return std::tolower(c); 工作正常,但它只是将“标准”字符转换为小写,而不是 É。
我有一些线程同时执行相同的函数,使用 C++11 并使用 g++ 编译(以防它与它有关)。
我想知道这是否是实现我想做的正确方法,或者还有其他方法。
谢谢!
【问题讨论】:
-
尝试找出问题出在线程还是语言环境。 1.) 它在单线程程序中工作吗? 2.) 它是否适用于多线程程序中的英文字符串和默认语言环境?
-
试试
std::tolower((unsigned char)c, std::locale())。来自the documentation:“如果ch的值不能表示为无符号字符且不等于EOF,则行为未定义。”问题是,char通常是有符号的,而像É这样的字符被表示为负值,然后超出了unsigned char的范围 -
@IgorTandetnik,正确!。请回答。 :-)
-
@IgorTandetnik 仍然抛出了 bad_cast。我理解你提出的逻辑,但看起来我必须改用 wstring。
-
@IgorTandetnik 这仅适用于 C 标准库中的单参数版本,不适用于 C++
<locale>中的双参数版本。