C++ - 错误E2285:在函数parseInput(fstream&)中找不到'tolower(char*)'的匹配项

6 c++ compiler-errors tolower

给出以下代码:

 void parseInput(fstream &inputFile) {
        const int LENGTH = 81;
        char line[LENGTH];

        while(!inputFile.fail()) {
            inputFile.getline(line,LENGTH);
            line = tolower(line);
            cout << line << endl;
        }
    }
Run Code Online (Sandbox Code Playgroud)

编译时我收到此错误:

错误E2285:在函数parseInput(fstream&)中找不到'tolower(char*)'的匹配项

我知道它返回一个int,但不是int [],这是否意味着我不应该使用getline来获取字符的输入字符?有没有办法将整行转换为更低?在此先感谢大家的帮助!

San*_*huk 6

嗨tolower函数输入参数必须是char而不是char*,但是如果你使用std你可以使用string和std:transform来使字符串小写

std::string data = “MyStrData”; 
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于`char*`:`std :: transform(line,line + strlen(line),:: tolower);` (5认同)
  • 人们可以通过传递一个"\ x80"来轻松利用这个不安全的代码.在许多系统上,ctype函数使用查找表,`-128`将读取该查找表的内存.例如,在我的系统上,`islower(-2222222)`与SIGSEGV崩溃. (3认同)
  • 注意(a)`tolower`在命名空间`std`中并且应该是合格的(b)还有一个locale`std :: tolower`函数,所以`(int(*)(int))std :: tolower `可能需要用来消除歧义. (2认同)
  • -1表示错误使用`tolower`(其参数必须为非负或EOF). (2认同)

Goz*_*Goz 0

您只需执行以下循环即可将字符串逐个字符转换为小写:

const int lineLen = strlen( line );
for ( int i = 0; i < lineLen; i++ )
{
     line[i] = static_cast< char >( ::tolower( static_cast< unsigned char >( line[i] ) ) );
}
Run Code Online (Sandbox Code Playgroud)

编辑:此外,以下代码更简单(假设字符串以空结尾)。

_strlwr( line );
Run Code Online (Sandbox Code Playgroud)