为什么函数不返回更新的字符串长度而不是显示传递给函数的字符串的长度?
#include <string>
#include <iostream>
using namespace std;
int number_needed(string a, string b) {
for(int i=0;i<a.length();i++)
{
for(int j=0;j<b.length();j++)
{
if(a[i]==b[j]){
{
a[i]='\0';
b[j]='\0';
}
}
}
}
cout<<a<<" "<<b<<endl;
return a.length()+b.length();
}
int main(){
string x;
cin >> x;
string y;
cin >> y;
cout << number_needed(x, y) << endl;
return 0;
}
输入:
weasaa
asjdsa
输出:
wea jds
12(来自func number_needed的返回值)
预期:
返回func number_needed的值为:
wea jds
6
答案 0 :(得分:3)
答案 1 :(得分:0)
在if中你真正想做的是:
if (a[i] == b[j])
{
a.erase(i, 1);
b.erase(j--, 1); //decrement j so we can check the new char at b[j]
}
这将从索引i
开始(当然包括)每个字符串中删除1个元素(根据您的需要更改数字)。一个字符串可以包含任意数量的'\ 0',这不会影响大小。如果它是一个字符,那么它将计入字符串的总大小。
答案 2 :(得分:0)
您要完成的操作可能是删除std::string
A 和 B 中的重复字母,但您只需将其更改为\0
,不会改变字符串长度。另外,根据您的代码,您的结果应该是:
we\0\0\0a \0\0\0jds\0
12
所以在你的控制台中,它可能看起来像:
we a jds
12
但如果您需要预期结果,请检查:
for (auto Itr_a = a.begin(); Itr_a != a.end(); ++Itr_a)
{
for (auto Itr_b = b.begin(); Itr_b != b.end();)
{
if (*Itr_a == *Itr_b)
{
Itr_a = a.erase(Itr_a);
Itr_b = b.erase(Itr_b);
}
else
++Itr_b;
}
}
输出:
wea jds
6
答案 3 :(得分:0)
length
(与首选size
方法相同)返回:
CharT
中string
个元素的数量,即std::distance(begin(), end())
由于string::operator[]
不会使迭代器无效,这意味着您可以为字符串中的每个字符分配一个空值,并且不会改变长度。
您可以使用count_if
查找'\0'
中非string
个字符的数量。您可以像这样使用它:count_if(begin(a), end(a), [](const auto& i){ return i != '\0'; })
通过此更改,您的return
语句将如下所示:
return count_if(begin(a), end(a), [](const auto& i){ return i != '\0'; }) + count_if(begin(b), end(b), [](const auto& i){ return i != '\0'; })
修改强>
可以在这里发表一些评论:
cout
- 语句number_needed
可以替换为set_symetric_difference
cout
- 语句,则应考虑2 set_difference
个语句if
- 语句应以break
结尾,并且应通过const-reference传递2个参数。