【问题标题】:C++ convert word in type string variable to lowercase [duplicate]C ++将类型字符串变量中的单词转换为小写[重复]
【发布时间】:2014-04-26 16:15:48
【问题描述】:

为了简单起见,我选择使用类型“字符串”而不是“字符”。但我应该将我从输入文件中读取的字符串小写。我当时不知道我不能使用'tolower()'。但是我确实找到了一种使用“转换”的方法。但我无法让它工作,也找不到将它与一系列结构一起使用的示例。请帮忙。如果可能的话,我还必须将每个州的第一个字母大写,因此如果您能指出正确的方向,将不胜感激。

#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;

【问题讨论】:

  • 那么tolower()到底有什么问题?
  • 尝试在tolower 之后删除() - 你想传递函数,而不是调用它。
  • 无论我使用 'transform' 还是 'tolower()' 我都会得到 'error: cannot convert 'std::string' to 'int' for argument '1' to 'int tolower(int)' .我不明白,因为“entry.state”变量是一个字符串
  • 删除 'tolower' 之后的 '()' 给出 'no matching function for call to transform' 和一堆额外的行
  • 丹尼尔给你举了一个例子

标签: c++ string data-structures


【解决方案1】:

问题是在行

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

您调用的是 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)字符

【讨论】:

  • 非常感谢。完美运行
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2016-01-26
  • 2016-05-22
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多