首页 > 解决方案 > 为什么我的代码无法将一个字符串复制到另一个字符串?

问题描述

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

标签: cstringpointersvisual-studio-2013

解决方案


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

推荐阅读