0

我有这个问题,我有一个字符串,我将它作为字符指针传递给函数。

 void test(char * str) {
    ....
 }

其中str =“abc”。现在我想在这个字符串的末尾添加一些额外的字符而不创建新字符串。我不想使用 strcat,因为我不知道要在字符串末尾添加多少个字符以及要添加什么。我试图使用 realloc 但它不起作用,因为 str 是在堆栈上分配的。

有什么办法可以动态增加 char 数组的大小?

更新:我被问到一个在我的采访中涉及到的问题。我被要求在不使用额外空间的情况下这样做。因此,如果我使用 malloc 分配内存,我在技术上是在使用额外的空间,对吗?

谢谢

4

6 回答 6

3

不,特别是如果字符串是在堆栈上分配的。堆栈空间在编译时是固定的。您必须首先分配更多空间,或者分配一个具有更多空间的新数组并strcpy结束。

于 2013-03-25T16:37:18.413 回答
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

这种方式可以扩展到在原始字符串前面添加不同的字符串。

于 2013-03-25T17:58:12.030 回答
0

如果您使用的是 C++ - 然后坚持std::string并忘记整个处理char *.

但是,如果您希望使用char *for 字符串,则分配一个新的字符数组并strcpy()从一个字符串到另一个字符串。不要忘记释放原始char *内存以避免内存泄漏。

在我的采访中,有人问了我一个与此有关的问题。我被要求在不使用额外空间的情况下这样做。因此,如果我使用 malloc 分配内存,我在技术上是在使用额外的空间,对吗?

如何在不增加额外空间的情况下增加字符串的长度?

于 2013-03-25T16:52:29.880 回答
0
void test(string  &str) {
    ....
    str += "wibble";
 }

似乎适用于 C++

于 2013-03-25T16:52:33.683 回答
0

您必须delete使用旧字符串并分配一个new具有所需长度的新字符串。

于 2013-03-25T16:36:59.607 回答
0

抱歉,没有。无法调整动态变量/数组的大小。问题是另一个变量,甚至另一个调用框架可能紧跟在相关变量之后。这些不能移动以腾出空间,因为在代码的其他地方可能存在指向这些对象的指针。

于 2013-03-25T16:39:26.620 回答