我有动态字符串的数组:
string *acc = new string[2];
string some_string;
我想在这个数组中添加两个字符串,但是引用存在问题(我认为)。
我有以下示例(非常难看,但它显示了问题):
for ( int i = 0; i < 2; i ++ ) {
if ( i == 0 )
some_string = "ab";
else
some_string = "cd";
acc[i] = some_string;
some_string = "";
}
return acc
当然这段代码没有任何意义,但我的代码更复杂,它会隐藏问题。
关键是代码返回cd
而不是abcd
。在我看来,some_string = "";
在这里弄得一团糟。我对吗?
是否可以保持代码逻辑?
答案 0 :(得分:1)
不,你只是犯了一个错误:
for ( int i = 0; i < 2; i ++ ) {
if ( i == 0 ) // == instead of = !!!!!!!!!!!!!!!!!!!!!!
some_string = "ab";
else
some_string = "cd";
acc[i] = some_string;
some_string = "";
}
return acc;
考虑使用std :: vector或std :: list而不是指针。使用向量,您的代码如下所示:
std::vector<std::string> vs;
......以后......
vs.push_back("ab");
vs.push_back("cd");
答案 1 :(得分:1)
我真的不认为你应该这样写代码。并且您不需要临时some_string
- 分配字符串是明确定义的,并且完全按照它应该做的。在这种情况下,使用vector
- 它是更多更安全的方法:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> ac;
for(int i = 0; i < 2; ++i)
{
if(i == 0)
ac.push_back("ab");
else
ac.push_back("cd");
}
cout<<ac[0]<<ac[1]<<endl;
return 0;
}
工作样本:here。
答案 2 :(得分:1)
目前尚不清楚为什么你会期望“abcd”。 您为some_string分配值“cd”而不是添加到“ab”。
也许这就是你想要的:
string* func()
{
string *acc = new string[2];
string some_string;
for ( int i = 0; i < 2; i ++ )
{
if ( i == 0 )
some_string = "ab"; // "ab"
else
some_string = some_string + "cd"; // "ab" + "cd" -> "abcd"
acc[i] = some_string;
//some_string = "";
}
return acc;
}
int main(int argc, char** argv)
{
string* y = func();
cout << y[0] << endl; // First element "ab"
cout << y[1] << endl; // Second element "abcd"
// Other stuff
// ....
// Remember to delete y
return(0);
}
输出:
ab
abcd
但正如其他人所说的......改为使用矢量。
你也可以像这样使用std :: array:
array<string, 2> func2()
{
array<string, 2> res;
string some_string;
for ( int i = 0; i < 2; i ++ )
{
if ( i == 0 )
some_string = "ab";
else
some_string = some_string + "cd";
res[i] = some_string;
}
// Or just this instead of a for loop
// res[0] = "ab";
// res[1] = "abcd";
return res;
}
int main(int argc, char** argv)
{
array<string, 2> z = func2();
cout << z[0] << endl;
cout << z[1] << endl;
return(0);
}