这可能吗?根据我想要完成的事情,似乎并非如此。
功能
static std::string str_repeat(std::string * str, int num_times) {
std::string * str_rep = new std::string;
for (int n = 1; n <= num_times; n++) {
str_rep = str_rep + str;
}
std::string ret = *str_rep; //error
delete str;
delete str_rep;
return ret;
}
更新
抱歉,我没有首先发布错误,因为我认为这是一个普遍的C ++问题,我做错了。在这里。
error: invalid operands of types ‘std::string* {aka std::basic_string<char>*}’ and ‘std::string* {aka std::basic_string<char>*}’ to binary ‘operator+’
答案 0 :(得分:7)
首先,如果您说new std::string
,那么您可能会做错事。此代码中不应包含任何指针(str_rep = str_rep + str
是代码中的指针算法,而不是附加,这就是解除引用结果失败的原因。)
std::string str_repeat(const std::string& str, int num_times) {
std::string ret;
for (int n = 0; n < num_times; ++n) {
ret += str;
}
return ret;
}
答案 1 :(得分:1)
我在这里猜测,因为这就是你要求的。当你决定告诉全世界“错误”的含义时,我可能需要修改答案。
我猜你有一个运行时错误,因为*str_rep
是垃圾。
因为这部分是垃圾:
for (int n = 1; n <= num_times; n++) {
str_rep = str_rep + str;
}
str_rep
和str
都是指针,你正在向另一个添加一个,但它们指向的是什么?如果要附加字符串,请执行:
for (int n = 1; n <= num_times; n++) {
*str_rep = *str_rep + *str;
}
或者根本不使用指针,这样做没有任何好处。
答案 2 :(得分:1)
operator +
上的 std::string *
表示指针操作,不字符串连接。你不需要跳过任何一个篮球; std::string
将在内部为其内容分配足够大的缓冲区。将您的功能更改为:
static std::string str_repeat(const std::string& str, int num_times) {
std::string result("");
for (int n = 1; n <= num_times; n++) {
result += str;
}
return result;
}
并调用它传入正确的字符串,而不是字符串的地址:
std::string myString(...);
std::string str = str_repeat(myString, 10);
std::string str2 = str_repeat("foobar", 100);
我觉得已经有一个标准的库函数正是为了这个目的,尽管我无法想到它。
答案 3 :(得分:1)
您正在尝试将两个指针添加到一起,这就是它不会编译的原因。不要忘记指针是一个内存地址,在你的例子中不会调用+运算符 - 你必须取消引用指针,但我不建议在这种情况下使用该模式。我建议你阅读一些关于指针和参考文献的内容: - )
删除内存时要非常小心。删除内存远离分配它的上下文是不好的做法 - 这是一个bug的配方。此外,如果您在调用'delete str'之前在堆栈上分配,您的应用程序可能会崩溃。
对于字符串操作,我建议通过const引用传递。因此,将为您处理内存分配,因为您可以按值传递std :: string,并且它将在内部根据需要执行内存分配...
另外两点。 在C语言中,我们通常从'0'开始计数,所以我会改变你的for循环 在适当的应用程序中,我会在输入参数上有一些调试断言:即你应断言num_times是'&gt; 0'
以下代码使用结果“barbarbar”编译并执行...
干杯,祝你好运, 乔恩
#include <string>
#include <iostream>
using namespace std;
static string str_repeat(const string& str, int count)
{
string returnData;
for (int n = 0; n < count; n++)
{
returnData.append(str);
}
return returnData;
}
int main(int argc, char* argv[])
{
string foo = "bar";
string duplicated = str_repeat(foo, 3);
cout << duplicated;
return 0;
}