我有这个问题,我有一个字符串,我把它作为字符指针传递给函数。
void test(char * str) {
....
}
其中str =“abc”。现在我想在此字符串的末尾添加一些额外的字符,而不创建新的字符串。我不想使用strcat,因为我不知道我添加到字符串末尾有多少字符以及我要添加的内容。我试图使用realloc,但它不能正常工作,因为str是在堆栈上分配的。
有没有办法可以动态增加char数组的大小?
更新: 在我的采访中,我被问到一个涉及此问题的问题。我被要求在不使用额外空间的情况下这样做。所以,如果我使用malloc分配内存,我在技术上会使用额外的空间吗?
由于
答案 0 :(得分:3)
不,特别是如果在堆栈上分配字符串。堆栈空间在编译时固定。您必须最初分配更多空间,或者分配一个具有更多空间且strcpy
结束的新数组。
答案 1 :(得分:0)
您必须delete
旧字符串,并使用new
分配一个新字符串,并使用您想要的长度。
答案 2 :(得分:0)
抱歉,没有。无法调整动态变量/数组的大小。问题是另一个变量,甚至另一个调用框架可能会紧跟在有问题的变量之后。这些不能移动以腾出空间,因为代码中的其他地方可能存在指向这些对象的指针。
答案 3 :(得分:0)
如果你正在使用C ++ - 那么坚持std::string
并忘记与char *
的整个交易。
但是,如果您希望将char *
用于字符串,则将一个新字符数组和strcpy()
从一个字符串分配给另一个字符串。不要忘记释放原始char *
内存以避免内存泄漏。
在我的采访中,我被问到一个涉及此问题的问题。我被要求在不使用额外空间的情况下这样做。所以,如果我使用malloc分配内存,我在技术上会使用额外的空间吗?
如何在不增加额外空间的情况下增加字符串的长度?
答案 4 :(得分:0)
void test(string &str) {
....
str += "wibble";
}
似乎适用于C ++
答案 5 :(得分:0)
您可以在输入字符串后面的字节中存储新值,而不是使用realloc(不在堆栈上完成)或strcpy(使用额外的缓冲区空间)。在下面的简单示例中,我以“abcd”开头,并在函数fn的末尾添加三个z。
void fn(char *str)
{
int len = strlen(str);
memset(str+len, 'z', 3);
str[len+3] = 0;
return;
}
int main()
{
char s[] = "abcd";
printf("%s\n", s);
fn(s);
printf("%s\n", s);
}
输出:
abcd
zzz
这种方式可以扩展到在原始字符串前添加不同的字符串。