C++将类型字符串变量中的单词转换为小写

C++ convert word in type string variable to lowercase

本文关键字:转换 单词 类型 字符串 变量 C++      更新时间:2023-10-16

为了简单起见,我选择使用类型"string"而不是"char"。但是我应该将从输入文件中读取的字符串小写。当时我不知道我将不能使用"tolower()"。然而,我确实找到了使用"transform"的方法。但我无法让它发挥作用,也找不到将它与一系列灰泥一起使用的例子。请帮忙。如果可能的话,我还必须将每个州的第一个字母大写,所以如果你能指出正确的方向,我将不胜感激。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <algorithm>
struct ATdata  
{
   string state;
   double miles;
   int shelters;
};
int readData( ifstream& input, struct ATdata data[] );
size_t readData( ifstream& input, struct ATdata data[], size_t MAX_ENTRIES );
int main()
{
    ifstream input;
    char filename[256];
    ATdata data[14];
    int i;
    cout << "Enter input file name: ";
    cin >> filename;
    input.open( filename );
    if ( input.fail() )
    {
        cout << "Input file does not exist." << endl;
        exit(1);
    }

    size_t linesRead = readData( input, data, sizeof ATdata data[], size_t MAX_ENTRIES );
    input.close();
    return(0);
}
size_t readData( ifstream& input, struct ATdata data[], size_t MAX_ENTRIES )
{
    size_t i;
    int j;
    while ( i < MAX_ENTRIES && !input.eof() )
    {
        ATdata entry;
        getline( input, entry.state );
        transform( entry.state.begin(), entry.state.end(), entry.state.begin(), tolower() );
        string nextLine;
        if ( !getline( input, nextLine ) )
        {
            break;
        }
        istringstream iss( nextLine );
        if ( !(iss >> entry.miles >> entry.shelters ) )
        {
            continue;
        }
        data[i++] = entry;
    }    
    for ( j = 0; j < 14; j++ )
    {
        cout << data[j].state << data[j].miles << data[j].shelters << endl;
    }
}
return i;

问题是在行

transform( ...., tolower() );

您正在调用函数tolower,而不是通过引用转换算法来传递它。--将括号()放在下括号中。。。

以下是课本示例。。。。

#include <iostream>     // std::cout
#include <algorithm>    // std::transform
#include <vector>       // std::vector
#include <functional>   // std::plus
int main () {
    std::string myname("my name IS soren");
    // To upper
    std::transform (myname.begin(), myname.end(), myname.begin(), ::toupper);
    std::cout << myname << std::endl; 
    // To lower
    std::transform (myname.begin(), myname.end(), myname.begin(), ::tolower);
    std::cout << myname << std::endl; 
    // Capitalize first
    std::transform (myname.begin(), myname.begin()+1, myname.begin(),  ::toupper);
    std::transform (myname.begin()+1, myname.end(),   myname.begin()+1,::tolower);
    std::cout << myname << std::endl; 

    return 0;
}

然而,正如其他人所指出的,这不能处理多字节(例如UTF-8)字符