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