将数组复制到另一个数组(字符串)中,在 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;
}
转换说明符 %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;
}
我正在开始学习 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;
}
转换说明符 %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;
}