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

时间:2019-03-28 18:01:35

标签: c string pointers visual-studio-2013

我想编写一个名为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);
}

它仍然无法正常工作。

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

#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);
}

现在,它正在工作。

Edit3:根据 alk 进行的以下修改对我有用:

#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);
}

2 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分: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)轻松地在函数内部派生它。


对不完整的代码表示抱歉。看来,我是从坐在一个高度完整的代码泄漏检测系统后面发布答案的。