C++ 函数返回零大小的字符串,即使其大小不是零

C++ 函数返回零大小的字符串,即使其大小不是零,c++,C++,我正在编写一个函数,它将返回给定数组中所有字符串的公共前缀字符串。但是我无法返回字符串,因为它的大小仍然显示为零 string Solution::longestCommonPrefix(vector<string> &A) { string s; int k=A.size(); int m=A[0].size(); for(int i=1;i<k;i++) { int j=A[i].size();

我正在编写一个函数,它将返回给定数组中所有字符串的公共前缀字符串。但是我无法返回字符串,因为它的大小仍然显示为零

string Solution::longestCommonPrefix(vector<string> &A) {
    string s;
    int k=A.size();
    int m=A[0].size();
    for(int i=1;i<k;i++)
    {
        int j=A[i].size();
        if(j<m) m=j;
    }
    int f;
    for(int i=0;i<k-1;i++)
    {
        for(f=0;f<m;f++)
        {
            if(A[i][f]==A[i+1][f])
            {
            s[f]=A[i][f];
            }
            else break;   
        }
        cout<<s.size();
    }
    return s;
}
字符串解决方案::longestCommonPrefix(vector&A){
字符串s;
int k=A.size();
int m=A[0].size();

对于(inti=1;i您正在索引到一个未初始化的字符串中。当您执行
s[f]=a[i][f]你实际上是在混合中引入了未定义的行为——你可能会写在字符串的内存中或者完全是其他的东西。无论行为如何,你都不会触发C++类为你公开的任何字符串的内部计数器。

相反,尝试执行
s+=A[i][f]
std::string
公开了
+=
操作符,用于将字符附加到现有字符串中。您可以在这里了解这一点以及
std::string
可以做的更多事情:

正如我在评论中提到的,字符串的大小
s
,始终为零,因为您从未实际更改过它的大小大小。字符串的大小可以通过赋值(
=
+=
)和两种方式改变。您的程序当前有未定义的行为,因为当您执行
s[f]=a[i][f]
时,您正在修改索引
f
处的
s
,即使
s
没有内容

那么如何解决这个问题呢?最初,您可以将
s
调整为
m
的大小,并暂时用空格填充。现在,在
if
语句中仍然存在逻辑问题。具体来说,使用
else
,因为如果达到
else
,您需要切断剩余的任何内容,然后更改
m
。有关完整的工作程序,请参见以下内容:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string longestCommonPrefix( const vector<string> &A ) {
    string s;
    int k = A.size();
    int m = A[0].size();
    for ( int i = 1; i < k; i++ ) {
        int j = A[i].size();
        if ( j < m ) m = j;
    }
    int f;
    s.resize( m, ' ' ); // temporary, just to set the contents
    for ( int i = 0; i < k - 1; i++ ) {
        for ( f = 0; f < m; f++ ) {
            if ( A[i][f] == A[i + 1][f] ) {
                s[f] = A[i][f]; // copy the similar values
            } else {
                m = f; // if we reach a character which is not the same, then we reset m
                s.resize( m ); // and resize the string
            }
        }
    }
    return s;
}

int main() {
    vector<string> a;
    a.push_back( "hello" );
    a.push_back( "hell" );
    a.push_back( "help" );
    a.push_back( "he" );
    cout << longestCommonPrefix( a );
    getchar();
}

编辑:第二个版本中出现了一个问题,再次出现了越界.UB(oops)。我在第一个
for
循环中添加了一个检查,现在如果
s
大于
a[I]

的话,它会调整
s[f]=a[I][f]的大小
并给出了实现,但是这里有另一个c++14或更高版本,带有
stl
算法

#include<algorithm>
#include<string>
#include<numeric>
#include<vector>


std::string longest_common_prefix(const std::vector<std::string>& v) {
    if (v.size() == 0) {
        return "";
    }
    auto begin = std::begin(v[0]), end = std::end(v[0]);
    end = std::accumulate(std::begin(v) + 1, std::end(v), end, [begin](auto end, const auto& s) {
        return std::mismatch(begin, end, std::begin(s), std::end(s)).first;
    });
    return std::string(begin, end);
}

#包括
#包括
#包括
#包括
std::字符串最长\u公共\u前缀(const std::vector&v){
如果(v.size()==0){
返回“”;
}
自动开始=标准::开始(v[0]),结束=标准::结束(v[0]);
结束=标准::累计(标准::开始(v)+1,标准::结束(v),结束[开始](自动结束,常数自动&s){
返回std::不匹配(开始、结束、std::开始、std::结束)。首先;
});
返回标准::字符串(开始、结束);
}

这是因为它的大小为零。您在任何时候都不会更改它的大小。您在
s[f]=A[i][f]中有未定义的行为
由于
s
的大小为零。我从不改变它的大小。我只是声明了一个字符串并向其传递值。请提供cout@anitashrivastava输入和相应输出的示例,您正在修改
字符串的内容,但是字符串的大小为零。str的最终大小是多少ing应该是什么?它应该包含什么?实际上,我将字符串数组作为输入(例如[abcde,abcdf,abcgh]),输出最大公共前缀(abc)
s+=A[i][f]
肯定会消除未定义的行为,大小为0,但会产生非常不正确的输出。
#include<algorithm>
#include<string>
#include<numeric>
#include<vector>


std::string longest_common_prefix(const std::vector<std::string>& v) {
    if (v.size() == 0) {
        return "";
    }
    auto begin = std::begin(v[0]), end = std::end(v[0]);
    end = std::accumulate(std::begin(v) + 1, std::end(v), end, [begin](auto end, const auto& s) {
        return std::mismatch(begin, end, std::begin(s), std::end(s)).first;
    });
    return std::string(begin, end);
}