嗯,这有点复杂。添加#include <cctype>
可能会解决你的问题。然而,还有更多事情发生。
有这两个版本tolower
:
int std::tolower(int ch); // #include <cctype>
template<typename charT>
charT std::tolower(charT ch, const std::locale& loc); // #include <locale>
但也可能有这个版本:
int ::tolower(int ch); // #include <cctype> or #include <ctype.h>
因为允许实现注入名称std
进入全局命名空间。另外,你不能指望cctype
or locale
是否包含在内,因为任何标准包含也可能包含任何其他标准包含。
您似乎打算使用以下版本<cctype>
。然而,这将是一个错误。如果您检查该版本的文档tolower
你会看到参数应该是转换成unsigned char
在传递给函数之前。
IOW,通过了char
cctype 版本为负值tolower
导致未定义的行为。 (尽管常见的实现支持它,因为这是一个常见的错误)。
要更正您的代码并仍然使用 cctype 版本,您可以编写:
#include <cctype>
// ...
transform(mystr.begin(), mystr.end(), mystr.begin(),
[](char ch) { return std::tolower( (unsigned char)ch ); } );
虽然使用起来似乎更简单一些:
for (char &ch : mystr)
ch = std::tolower( (unsigned char)ch );
The <locale>
版本看起来像(记住它是一个函数模板):
#include <locale>
#include <functional>
// ...
transform(mystr.begin(), mystr.end(), mystr.begin(),
std::bind( std::tolower<char>, std::placeholders::_1, std::locale() ) );
or
std::locale loc;
for ( char &ch : mystr )
ch = std::tolower(ch, loc);