为什么我的代码无法将一个字符串复制到另一个字符串? [关闭]

问题描述 投票:1回答:2

我想编写一个名为append()的C函数,其目标是在给定字符串的末尾附加一个字符。但是,由于一些与指针相关的问题,我无法使代码工作。

#include <stdio.h>

void append(char ** string, int length, char ch)
{
    printf("%s", string);

    char * newString = (char *) malloc(sizeof(char)*(length+2));

    strcpy(newString, string);

    newString[length ] = ch;
    newString[length + 1] = '\0';

    strcpy(string, newString);

    free(newString);
}

int main()
{
    char * string = "my1name234is56";
    append(string, strlen(string), 'x');

    printf("%s", string);
}

功能append()内部:strcpy()之前的第二个free()给了我一个例外,程序显示:

Unhandled exception at 0x5E8D40D9 (msvcr120d.dll) in mips_2_1.exe: 
0xC0000005: Access violation writing location 0x00D1585C.

我也试过了

strcpy(*string, newString);

strcpy(**string, newString);

并且,似乎没有任何工作。

.

strcpy(&string, newString);

似乎工作,但最终的结果不是我所期望的。

编辑:我根据alk进行了编辑。

#include <stdio.h>
#include <malloc.h>
#include <string.h>

void append(char ** string, int length, char ch)
{
    printf("%s\n\n", *string);

    char * newString = (char *)malloc(sizeof(char)*(length + 2));

    strcpy_s(newString, length+1, *string);

    newString[length] = ch;
    newString[length + 1] = '\0';

    strcpy_s(*string, length + 2, newString);

    *string = newString;
}

int main(void)
{
    char * string = "my1name234is56";
    append(&string, strlen(string), 'x');

    printf("%s", string);
}

它仍然无法正常工作。

编辑2:我根据“风向标”进行了以下编辑:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

char * append(const char * string, int length, char ch)
{
    char * newString = (char *)malloc(sizeof(char)*(length + 5));

    printf("%s\n\n", string);

    strcpy_s(newString, length+5, string);

    newString[length] = ch;
    newString[length + 1] = '\0';

    return newString;
}

int main(void)
{
    char * string = "my1name234is56";

    printf("%s\n\n", string);

    char * string2 = append(string, strlen(string), 'x');

    printf("%s", string2);
}

现在,它正在发挥作用。

编辑:根据所有,以下修改,为我工作:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

void append(char ** string, int length, char ch)
{
    char * newString = (char *)malloc(sizeof(char)*(length + 2));

    strcpy_s(newString, length + 1, *string);

    newString[length] = ch;
    newString[length + 1] = '\0';

    *string = newString;
}

int main(void)
{
    char * string = "my1name234is56";

    printf("%s\n\n", string);

    append(&string, strlen(string), 'x');

    printf("%s\n\n", string);
}
c string pointers visual-studio-2013
2个回答
2
投票

你快到了。

但是,您需要将传入的指针的值更改为指向您分配的内存的指针的值,而不是将其释放。

以下仅显示更改的行。

...

void append(char ** string, size_t length, char ch)
{
    printf("%s\n", *string);

    ...

    strcpy(newString, *string);

    ...

    *string = newString;
}

int main(void)
{
    ...
    append(&string, strlen(string), 'x');
    ...
}

你,BTW,不需要传递源的大小,但你可以通过执行strlen(*string)轻松地在函数内部派生它。


为不完整的代码而烦恼。我似乎是在高度完整的代码泄漏检测系统后面发布了答案。


2
投票

char * string = "my1name234is56";是一个字符串文字。有两个原因导致您无法将扩展字符串写回:

  • 额外字符没有足够的内存。
  • 它是只读的。

在任何情况下,函数定义都有太多的星星,它应该是

void append(char * string, int length, char ch)

甚至更好

void append(const char * string, int length, char ch)

这表明不应该写入,整个想法是禁止的。您必须创建一个新字符串并返回指向该字符串的指针

char *append(const char * string, int length, char ch) {
    // ...
    return newString;
}

int main() {
    //...
    string = append(string, strlen(string), 'x');
}
© www.soinside.com 2019 - 2024. All rights reserved.