【问题标题】:any way to read in and make lower case in same step?有什么方法可以在同一步骤中读取并制作小写字母?
【发布时间】:2015-01-20 05:27:13
【问题描述】:

我正在通过

阅读用户输入
string word;
while(cin >> myWord)
    //put myWord in array

但为了排序,我希望“This”和“this”相同。对于我的排序算法,我使用字符串的默认 值,所以 This != this ,出于我的目的,我需要它 == 所以我想在读入时立即将所有内容设为小写。我知道我需要创建一个for 循环来遍历单词并将其设为小写,因此在将单词放入数组之前,我需要在while 循环中执行此操作。但我想知道是否有什么技巧可以让 cin 中的单词变成 myWord 已经小写(或在读入后立即将“myWord”变为小写),按照@987654326 的行@是我在说的

【问题讨论】:

  • 我不确定如何在同一步骤中执行此操作,但您可以在将其放入数组之前调用tolower 以确保它是小写的。
  • 我将通过自定义SortPredicate 更改std::sort 中的排序顺序,该SortPredicate 比较忽略大小写的字符串。
  • 通过预处理器运行您的输入:tr A-Z a-z | my-program
  • @TommyK 按原样添加单词,不要更改大小写。当您致电std::sort 时,您可以在此处进行不区分大小写的比较。

标签: c++ cin lowercase tolower


【解决方案1】:

我就是这样做的,对std::string使用自定义排序谓词

#include <algorithm>
#include <iostream>
#include <locale>
#include <string>

struct SortNoCase // functor used to sort strings ignoring the case
{
    bool operator()(const std::string& lhs, const std::string& rhs) const
    {
        std::string lhs_lower, rhs_lower;
        std::transform(std::begin(lhs), std::end(lhs), 
            std::back_inserter(lhs_lower), ::tolower);
        std::transform(std::begin(rhs), std::end(rhs), 
            std::back_inserter(rhs_lower), ::tolower);
        return lhs_lower < rhs_lower;
    }
};


int main ()
{
    std::vector<std::string> vs{"Some", "strings", "THAT", "are", "UnSorted"};

    std::sort(std::begin(vs), std::end(vs), SortNoCase());

    for(auto&& elem: vs)
        std::cout << elem << " ";
    std::cout << std::endl;
}

PS:还有更复杂的方法,例如使用自定义 char 特征,但这样做很容易理解。如果你真的很古玩,可以看这里:

https://stackoverflow.com/a/5319855/3093378

【讨论】:

    【解决方案2】:
    std::for_each(myWord.begin(),myWord.end(),[] (char &c) {c=std::tolower(c);}); 
    

    【讨论】:

    • 如果这是 OP 需要的,它可以完美运行,尽管我的印象是他想忽略大小写对字符串数组进行排序。
    • @vsoftco 我也觉得有点混乱。他写道,他希望立即转换为小写。我希望这一班轮非常即时。如果他想保持大小写并且只更改排序顺序,他绝对应该使用您的服装比较器。
    猜你喜欢
    • 2021-04-24
    • 2020-02-20
    • 2015-07-05
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多