简单的字符串复制,但 memcpy 不起作用
simple string copy, but memcpy doesn't work
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
unsigned char str[] = "abcdefg";
unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);
memcpy(str1, str, (sizeof(str)-1) );
for(int i = 0; i<(sizeof(str1)); i++)
printf("%c", str1[i]);
free(str1);
}
我想将字符串 str
复制到 str1
但输出是
abcd
表示只复制指针byte(4byte)。
然后我尝试
printf("%d", sizeof(str)-1 );
它的输出是7
我的错误是什么?
it mean that only pointer byte(4byte) is copied.
不,不是。您假设您的打印输出是正确的,但事实并非如此。您可以在数组上使用 sizeof
但不能在指针上使用。嗯,你可以,但这意味着不同的东西。
全部复制。您只是打印前四个字符。更改为:
for(int i = 0; i<(sizeof(str) - 1); i++)
此外,不要强制转换 malloc。原因如下:Do I cast the result of malloc?
str1
是一个指针,而 str
是一个字符数组。当您在 for
循环中说 sizeof(str1)
时,它会迭代 4 次,因为 sizeof(str1)
必须计算为 4
(32 位编译器),而 sizeof(str)
计算为正确的长度。
您应该阅读 What is the size of a pointer? 一次以了解有关指针大小的更多信息。
固定码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
unsigned char str[] = "abcdefg";
unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);
memcpy(str1, str, (sizeof(str)-1) );
for(int i = 0; i<(sizeof(str) - 1); i++)
printf("%c", str1[i]);
free(str1);
}
先是错误再是正确的代码:
错误:
- 永远不要使用
sizeof(str)
来获取字符串的长度。它不适用于指针。相反,使用 strlen(str) + 1
.
- 您正在从
malloc
调用的字符串大小中减去 1。为什么?您没有为结尾的 NULL 字符制作 space。
- 复制字符串时,如果您知道目标字符串足够大以存储源字符串,请使用
strcpy
而不是 memcpy
。如果您只需要一个额外的大小参数,例如 memcpy
,请使用 strncpy
。 memcpy
不是要处理字符串,而是要处理普通数组。
- 用于字符串的正确类型是
char
,而不是 unsigned char
。
- 不是真正的错误,但要打印字符串,您可以使用
printf("%s", str)
或 puts(str)
。为什么要使用 for 循环?
void main()
被 C 标准禁止。
正确代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "abcdefg";
char str1* = malloc(strlen(str) + 1);
strcpy(str1, str);
puts(str1);
free(str1);
//return 0; - default in C99 and later
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
unsigned char str[] = "abcdefg";
unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);
memcpy(str1, str, (sizeof(str)-1) );
for(int i = 0; i<(sizeof(str1)); i++)
printf("%c", str1[i]);
free(str1);
}
我想将字符串 str
复制到 str1
但输出是
abcd
表示只复制指针byte(4byte)。
然后我尝试
printf("%d", sizeof(str)-1 );
它的输出是7
我的错误是什么?
it mean that only pointer byte(4byte) is copied.
不,不是。您假设您的打印输出是正确的,但事实并非如此。您可以在数组上使用 sizeof
但不能在指针上使用。嗯,你可以,但这意味着不同的东西。
全部复制。您只是打印前四个字符。更改为:
for(int i = 0; i<(sizeof(str) - 1); i++)
此外,不要强制转换 malloc。原因如下:Do I cast the result of malloc?
str1
是一个指针,而 str
是一个字符数组。当您在 for
循环中说 sizeof(str1)
时,它会迭代 4 次,因为 sizeof(str1)
必须计算为 4
(32 位编译器),而 sizeof(str)
计算为正确的长度。
您应该阅读 What is the size of a pointer? 一次以了解有关指针大小的更多信息。
固定码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
unsigned char str[] = "abcdefg";
unsigned char *str1 = (unsigned char*)malloc(sizeof(str) -1);
memcpy(str1, str, (sizeof(str)-1) );
for(int i = 0; i<(sizeof(str) - 1); i++)
printf("%c", str1[i]);
free(str1);
}
先是错误再是正确的代码: 错误:
- 永远不要使用
sizeof(str)
来获取字符串的长度。它不适用于指针。相反,使用strlen(str) + 1
. - 您正在从
malloc
调用的字符串大小中减去 1。为什么?您没有为结尾的 NULL 字符制作 space。 - 复制字符串时,如果您知道目标字符串足够大以存储源字符串,请使用
strcpy
而不是memcpy
。如果您只需要一个额外的大小参数,例如memcpy
,请使用strncpy
。memcpy
不是要处理字符串,而是要处理普通数组。 - 用于字符串的正确类型是
char
,而不是unsigned char
。 - 不是真正的错误,但要打印字符串,您可以使用
printf("%s", str)
或puts(str)
。为什么要使用 for 循环? void main()
被 C 标准禁止。
正确代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "abcdefg";
char str1* = malloc(strlen(str) + 1);
strcpy(str1, str);
puts(str1);
free(str1);
//return 0; - default in C99 and later
}