6

给定以下代码:

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

        while(!inputFile.fail()) {
            inputFile.getline(line,LENGTH);
            line = tolower(line);
            cout << line << endl;
        }
    }

编译时出现此错误:

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

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

4

6 回答 6

6

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

std::string data = “MyStrData”; 
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
于 2010-12-05T22:15:05.003 回答
3

独立tolower函数只接受一个int,并且int需要严格非负或EOF,否则行为未定义。另一个版本的tolower存在,但是它是一个模板。这两个事实都使得难以transform轻松安全地使用它们。

C++ 还提供tolower了它的ctype方面,您可以在此处使用

std::ctype<char> const& c = std::use_facet< std::ctype<char> >(std::locale());
c.tolower(line, line + std::strlen(line));

然而整个代码表明你不熟悉数组和点,所以也许你应该开始使用std::string和易于使用的算法?看看boost::string_algo's case 转换

于 2010-12-05T22:23:13.023 回答
1

嗯,这里的三个答案都用tolower 了。

其参数必须为非负数或特殊EOF值,否则为未定义行为。如果你只有 ASCII 字符,那么代码都是非负的,所以在这种特殊情况下,它可以直接使用。但是,如果有任何非 ASCII 字符,例如挪威语“blåbærsyltetøy”(蓝莓果酱),那么这些代码很可能是负数,因此char必须将参数转换为无符号类型。

此外,对于这种情况,应将 C 语言环境设置为相关的语言环境。

例如,您可以将其设置为用户的默认语言环境,它由一个空字符串表示为setlocale.

例子:

#include <iostream>
#include <string>           // std::string
#include <ctype.h>          // ::tolower
#include <locale.h>         // ::setlocale
#include <stddef.h>         // ::ptrdiff_t

typedef unsigned char   UChar;
typedef ptrdiff_t       Size;
typedef Size            Index;

char toLowerCase( char c )
{
    return char( ::tolower( UChar( c ) ) );     // Cast to unsigned important.
}

std::string toLowerCase( std::string const& s )
{
    using namespace std;
    Size const      n   = s.length();
    std::string     result( n, '\0' );

    for( Index i = 0;  i < n;  ++i )
    {
        result[i] = toLowerCase( s[i] );
    }
    return result;
}

int main()
{
    using namespace std;
    setlocale( LC_ALL, "" );                    // Setting locale important.
    cout << toLowerCase( "SARAH CONNER LIKES BLÅBÆRSYLTETØY" ) << endl;
}

改为使用以下方式执行此操作的示例std::transform

#include <iostream>
#include <algorithm>        // std::transform
#include <functional>       // std::ptr_fun
#include <string>           // std::string
#include <ctype.h>          // ::tolower
#include <locale.h>         // ::setlocale
#include <stddef.h>         // ::ptrdiff_t

typedef unsigned char   UChar;

char toLowerCase( char c )
{
    return char( ::tolower( UChar( c ) ) );     // Cast to unsigned important.
}

std::string toLowerCase( std::string const& s )
{
    using namespace std;
    string          result( s.length(), '\0' );

    transform( s.begin(), s.end(), result.begin(), ptr_fun<char>( toLowerCase ) );
    return result;
}

int main()
{
    using namespace std;
    setlocale( LC_ALL, "" );                    // Setting locale important.
    cout << toLowerCase( "SARAH CONNER LIKES BLÅBÆRSYLTETØY" ) << endl;
}

有关使用 C++ 级别语言环境而不是 C 语言环境的示例,请参阅 Johannes 的回答。

干杯&hth.,

于 2010-12-05T23:24:19.843 回答
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] ) ) );
}

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

_strlwr( line );
于 2010-12-05T22:15:17.850 回答
0

是和不是。你可以得到一整行,但在 char 之后使用 for 循环打印它(并使用 tolower)。

于 2010-12-05T22:19:10.777 回答
-1

tolower()一次只能处理一个角色。你应该做类似的事情

for(int i = 0; i < LENGTH; ++i)
  line[i] = tolower(line[i]);
于 2010-12-05T22:15:40.590 回答