C++ c++;toupper()来比较两个字符串

C++ c++;toupper()来比较两个字符串,c++,string,toupper,C++,String,Toupper,我创建了一组算法,它接收字符串向量的输入,检查是否有任何字符串出现不止一次:如果是,则从向量中删除所有其他字符串,然后输出新的“打火机”数组,而无冗余 它工作得很好,但现在我要使它不区分大小写;我试图简单地将toupper()std函数添加到=比较语句中,但是它似乎不起作用 我有一个比较熟悉的java后台,我在尝试学习C++。 有人能告诉我如何纠正我的语法吗 // Output old list. cout << endl << "==========\nOld list

我创建了一组算法,它接收字符串向量的输入,检查是否有任何字符串出现不止一次:如果是,则从向量中删除所有其他字符串,然后输出新的“打火机”数组,而无冗余

它工作得很好,但现在我要使它不区分大小写;我试图简单地将
toupper()
std函数添加到
=
比较语句中,但是它似乎不起作用

<>我有一个比较熟悉的java后台,我在尝试学习C++。 有人能告诉我如何纠正我的语法吗

// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
    cout << endl << list[i];
}
cout << endl << endl;

// Check uniqueness.
for (int i = 0; i < count; i++)
    for (int j = i+1; j < count; j++) {
        if (toupper(list[i]) == toupper(list[j])) {
            list[j] = "";
            count--;
        }
    }

// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
    cout << endl << list[i];
}
cout << endl << endl;
//输出旧列表。
不能首先

list[j] = ""; // should never work. 
您可以使用擦除删除字符

list.erase(j, 1);
或者,为了完全避免这种情况,您可以使用一个临时的“生成器”字符串,并在需要时将字符推回给它。

首先

list[j] = ""; // should never work. 
您可以使用擦除删除字符

list.erase(j, 1);

或者,为了完全避免这种情况,您可以使用一个临时的“生成器”字符串,并在需要时将字符推回给它。

我只是快速搜索了toupper,但没有找到它的任何字符串版本。我见过的唯一标准toupper()是
inttoupper(intc)-这意味着您只能使用它来比较单个字符!你试过了吗


根据编译器的不同,您可以使用或不使用此函数

我只是在谷歌上快速搜索了一下toupper,没有找到它的任何字符串版本。我见过的唯一标准toupper()是
inttoupper(intc)-这意味着您只能使用它来比较单个字符!你试过了吗


根据编译器的不同,您可以使用或不使用此函数

@DaveS,谢谢你,Dave,我会试试的;它看起来又干净又短。然而,我发现更脏的解决方案是使用变换并复制旧向量

    // Output old list.
    cout << endl << "==========\nOld list:\n==========";
    for (int i = 0; i < count; i++) {
        cout << endl << list[i];
    }
    cout << endl << endl;

    // Check uniqueness.
    for (int i = 0; i < count; i++)
        for (int j = i + 1; j < count; j++) {
            std::transform(list[i].begin(), list[i].end(), list[i].begin(), ::toupper);
            std::transform(list[j].begin(), list[j].end(), list[j].begin(), ::toupper);
            if (list[i] == list[j]) {
                newlist[j] = "";
                count--;
            }
        }

    // Output new list.
    cout << endl << "==========\nNew list:\n==========";
    for (int i = 0; i < count; i++) {
        cout << endl << newlist[i];
    }
    cout << endl << endl;
//输出旧列表。

cout@DaveS,谢谢你,Dave,我会试试的;它看起来又干净又短。然而,我发现更脏的解决方案是使用变换并复制旧向量

    // Output old list.
    cout << endl << "==========\nOld list:\n==========";
    for (int i = 0; i < count; i++) {
        cout << endl << list[i];
    }
    cout << endl << endl;

    // Check uniqueness.
    for (int i = 0; i < count; i++)
        for (int j = i + 1; j < count; j++) {
            std::transform(list[i].begin(), list[i].end(), list[i].begin(), ::toupper);
            std::transform(list[j].begin(), list[j].end(), list[j].begin(), ::toupper);
            if (list[i] == list[j]) {
                newlist[j] = "";
                count--;
            }
        }

    // Output new list.
    cout << endl << "==========\nNew list:\n==========";
    for (int i = 0; i < count; i++) {
        cout << endl << newlist[i];
    }
    cout << endl << endl;
//输出旧列表。
cout您的循环在
列表
数组向量中留下了“洞”,但数组向量的大小没有改变(但您减少了上限
计数

可能还有很多其他选择,但如果不想对其进行太多修改,可能需要在附加循环中将非空元素从
列表
数组复制到新数组中

编辑:整合部分答案 首先,我们将有一个函数来执行toUpper(这是从@Jim22150修改而来的)

现在,我们不能留下洞,所以我们应该使用擦除(如@Scott Christopher Stauffe所示):

//输出旧列表。
cout您的循环在
列表
数组向量中留下了“洞”,但数组向量的大小没有改变(但您减少了上限
计数

可能还有很多其他选择,但如果不想对其进行太多修改,可能需要在附加循环中将非空元素从
列表
数组复制到新数组中

编辑:整合部分答案 首先,我们将有一个函数来执行toUpper(这是从@Jim22150修改而来的)

现在,我们不能留下洞,所以我们应该使用擦除(如@Scott Christopher Stauffe所示):

//输出旧列表。

如果你想像java字符串一样轻松处理C++字符串,那就行了。安装Boost对于新手C++程序员来说可能有点困难(尽管它与许多其他C++库相比是微不足道的),但它是有回报的。 您的问题将基本上归结为:

boost::algorithm::to_upper_copy(list[i]) == boost::algorithm::to_upper_copy(list[j])

如果你想像java字符串一样轻松处理C++字符串,那就行了。安装Boost对于新手C++程序员来说可能有点困难(尽管它与许多其他C++库相比是微不足道的),但它是有回报的。 您的问题将基本上归结为:

boost::algorithm::to_upper_copy(list[i]) == boost::algorithm::to_upper_copy(list[j])


为什么不将
std::vector
std::remove_一起使用
if
lambda
?@OMGtechy是否不区分大小写?@Jim22150列表中字符串的顺序是否需要保持?@Mahesh,是的,输出相同的顺序,我希望保持我的算法相同。这不是问题所在(OMGtechy&Scott)。它怎么不起作用?什么是列表?std::string[N]?为什么不将
std::vector
std::remove_一起使用,如果
lambda
?@OMGtechy是否不区分大小写?@Jim22150是否需要维护列表中字符串的顺序?@Mahesh,是的,输出相同的顺序,我希望保持我的算法相同。这不是问题所在(OMGtechy&Scott)。它怎么不起作用?什么是列表?std::string[N]?.erase()似乎只用于向量中的字符,但我需要擦除向量的字符串元素。有没有线索,最好没有其他循环?有人提到这是一个数组,而不是一个数组vector@jsantander是的,对不起,我调整了我的问题;向量,而不是数组..erase()似乎只用于向量中的字符,但我需要擦除向量的字符串元素。有没有线索,最好没有其他循环?有人提到这是一个数组,而不是一个数组vector@jsantander是的,对不起,我调整了我的问题;向量,不是数组。是的,避免这种情况会很好。我正在尝试实现Scott的建议,但如果可能的话,我可能需要另一个for循环来避免。@Jim22150。。。是的,但真正的问题是不能收缩数组,除非复制它。如果可以在数组中使用向量,则可以从中删除…列表[]是向量,而不是数组。@Jim22150 ok。。。这很令人困惑。我对上面的答案进行了编辑,以整合其中的一些想法。我真的没有试过。是的,避免这样会很好。我正在努力实施斯科特的建议b