如何在C中复制字符串

时间:2014-05-10 20:57:06

标签: c string

如果我有一个函数scopy,它将一个C String从src复制到dest

char * scopy(char *dest, char *src) {
    char* r = dest;
    while (*src != '\0') {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;
    return r;
}

为什么这个函数在调用时会起作用2字符串初始化为这样 char a [6] =" abbbb"和 char b [4] =" dcd" 但是对于像这样初始化的字符串不起作用 char * a =" abbbb"和 char * b =" dcd"

3 个答案:

答案 0 :(得分:1)

这个函数在使用时会调用未定义的行为,因为它会尝试modify a string literal,所以你不能说它在两种情况下都有效。

它似乎适用于char[]这是一个巧合 - 一个不幸的事实,因为它给人留下了错误的印象。

答案 1 :(得分:1)

在下面的代码中,变量ptr指向只读内存部分,其中包含"xyz\0"。您可以更改变量本身,但不能更改它指向的内存的内容......

char* ptr = "xyz";

在下面的代码中,变量arr指向包含"xyz\0"的读/写内存部分。您无法更改变量本身,但您可以更改它指向的内存的内容...

char arr[] = "xyz";

以上内容应该可以帮助您理解为什么在第一种情况下出现分段错误...

话虽如此,您的代码中还有另一个问题 - 如果src指向的字符串比dest指向的字符串长,那么*dest = *src很可能会导致分段错误:

while (*src != '\0')
{
    *dest = *src;
    dest++;
    src++;
}

答案 2 :(得分:0)

char * a =" abbbb"被称为字符串文字,其中iirc的行为与c中的char []不同。具体来说,我不相信你可以修改字符串文字的单个字符。

尝试查看here以获取两个构造函数之间的更多信息