函数不返回修改后的字符串长度

时间:2016-10-28 14:24:53

标签: c++ string function return stdstring

为什么函数不返回更新的字符串长度而不是显示传递给函数的字符串的长度?

#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

4 个答案:

答案 0 :(得分:3)

std::string计算的字符串,而不是 NUL终止字符串。

因此,改变任意字符都不会改变它的长度。

如果您想更改其大小,请使用.resize(newlength)

答案 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方法相同)返回:

  

CharTstring个元素的数量,即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'; })

修改

可以在这里发表一些评论:

  1. 除了cout - 语句number_needed可以替换为set_symetric_difference
  2. 如果需要cout - 语句,则应考虑2 set_difference个语句
  3. 如果上述两者都不合适,则if - 语句应以break结尾,并且应通过const-reference传递2个参数。