将数组复制到另一个数组(字符串)中,在 C 中复制其内容

Copying array into array into another array (of strings), duplicate its content in C

我正在开始学习 C 的基础知识,但我被这个产生这种奇怪输出的简单程序困住了。我想做的是使用 memcpy() 函数将一个数组的内容复制到另一个数组中。

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

int main()
{   
    char source[13] = "Hello, World!";
    char destination[13];

    memcpy(&destination, &source, 13);

    printf("%s\n", destination);
    return 0;
}

"strange" 输出是:

Hello, World!Hello, World!(

让我想知道为什么会发生这种情况的原因是,如果我在 memcpy 中将 13 更改为 12,则输出是正确的,显然没有最后一个字符:

Hello, World

所以,我的问题是:"What I am missing? Is there some theoretical fundamental I don't know?"

C 中的每个字符串都需要以零结尾。因此,您的数组长度太小,无法容纳字符串,程序会调用 UB。

更改为:

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

int main()
{   
    char source[14] = "Hello, World!";
    char destination[14];

    memcpy(&destination, &source, 14);

    printf("%s\n", destination);
    return 0;
}

https://godbolt.org/z/Z_yyJX

转换说明符 %s 用于输出由零字符 '[=16=]'.

终止的字符序列的字符串

然而这个数组

char source[13] = "Hello, World!";

不包含字符串,因为它只有 13 个元素。所以它没有 space 作为初始化字符串文字的终止零。

要输出数组你需要使用另一种格式

printf("%.*s\n", 13, destination);

这是一个演示程序

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

int main()
{   
    enum { N = 13 };
    char source[N] = "Hello, World!";
    char destination[N];

    memcpy( destination, source, N );

    printf( "%.*s\n", N, destination );

    return 0;
}

它的输出是

Hello, World!

或者,您可以将数组定义为具有 14 个元素,其中一个元素保留用于终止零。

请注意,在 memcpy

的调用中使用以下参数是正确的
memcpy( destination, source, 13 );
#include <stdio.h>
#include <string.h>

int main()
{   
    char source[] = "Hello, World!"; // <<-- let the compiler do the counting
    char destination[sizeof source]; // <<-- let the compiler do the counting

    strcpy(destination, source);

    /* equivalent to:
      memcpy(destination, source, sizeof source);
    */

    printf("%s\n", destination);
    return 0;
}