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



我已经创建了一组算法,它接受字符串向量的输入,检查是否有字符串出现超过一次:如果是,则从向量中删除所有额外出现的字符串,然后输出新的,'更轻'的数组,没有冗余。

它工作得很好,除了现在我要使它不区分大小写;我试图简单地将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 数组向量,但数组向量的大小不改变(但你减少你的上限count)

可能有很多其他的选择,但是如果你不想对它做太多的修改,你可能需要在一个额外的循环中将非空元素从list数组复制到一个新的数组

编辑:整合部分答案

首先,我们将有一个函数来执行toUpper(这是从@Jim22150修改的)

std::string stringToUpper(const std::string &input) {
    std::string toBeModified=input;
    std::transform(toBeModified.begin(), toBeModified.end(), toBeModified.begin(), ::toupper);
    return toBeModified;
}

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

// 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(stringToUpper(list[i]) == stringToUpper(list[j])) {
            list.erase(j,1);
            count--;
        }
    }
}
// Output new list.
cout << endl << "==========nNew list:n==========";
for (int i = 0; i < count; i++) {
    cout << endl << newlist[i];
}
cout << endl << endl;

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

如果你想处理c++字符串像Java字符串一样容易,那么Boost字符串算法库就是你要走的路。对于一个c++新手程序员来说,安装Boost可能有点困难(尽管与许多其他c++库相比,它是一件轻而易举的事情),但它是值得的。

你的问题基本上可以归结为:

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

我只是做了一个快速谷歌toupper,我没有找到它的任何字符串版本。我见过的唯一标准的touppper()是int toupper(int c); -这意味着你只能用它来比较单个字符!你试过stricmp()吗?

        if ( 0 == _stricmp(list[i], list[j]) ) {
            list[j] = "";
            count--;
        }

根据你的编译器,你可能有也可能没有这个函数。

首先,

list[j] = ""; // should never work. 

可以使用erase删除一个字符。

list.erase(j, 1);

或者,为了完全避免这种情况,您可以使用临时的"builder"字符串,并在需要时向其推送字符。

相关内容

  • 没有找到相关文章

最新更新