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);
}