我有一个试图使用strcpy()
功能的程序。我知道当使用char数组时,例如:char array[10]
,可以通过以下方式设置空终止符:array[0] = '\0';
但是,在使用char指针时,如何设置空终止符? / p>
编辑:程序编译,但输出垃圾
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *target;
char *src = "Test";
target = malloc(sizeof(char));
src = malloc(sizeof(char));
strcpy(target,src);
printf("%c\n",target);
return 0;
}
答案 0 :(得分:9)
你不需要。 strcpy()
的第二个参数需要nul
终止,第一个参数需要符合源+ nul
终止符中的字符数。
您的代码中的问题是:
您正在以错误的方式使用sizeof
运算符,并且通过再次为其分配内存来覆盖src
指针。
要获得所需字符串的长度strlen()
,您不需要在每个指针上调用malloc()
。
您正在获取垃圾值,因为您正在从未初始化的数据进行复制,因为src
指向新分配的空间,因为
src = malloc(sizeof(char));
你不应该这样做。
sizeof(char) == 1
根据定义,所以你只为1个字节分配空间,如果它是一个有效的C字符串,则必须是'\0'
因为只有1个空间字符。
字符串的正确printf()
说明符为"%s"
,您使用"%c"
表示字符。
正确的方法是
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *target;
const char *src;
src = "Test"; /* point to a static string literal */
target = malloc(1 + strlen(src)); /* allocate space for the copy of the string */
if (target == NULL) /* check that nothing special happened to prevent tragedy */
return -1;
strcpy(target, src);
printf("%s\n", target);
/* don't forget to free the malloced pointer */
free(target);
return 0;
}
答案 1 :(得分:2)
在您的代码中
strcpy(target,src);
src
不会以空值终止。这会调用未定义的行为。
此外,通过使用malloc(sizeof(char));
,您可以为单个char
元素分配内存。 可能你不想要。
接下来,根据strcpy()
的{{3}},(强调我的)
strcpy()
函数将src
指向的字符串,(包括终止空字节('\0'
)复制到{{1}指向的缓冲区}}。字符串可能不重叠,目标字符串dest
必须足够大才能接收副本。
所以,只要
dest
数组。src
分配足够的内存,以便它可以容纳target
的内容。 最后,要提及的是,一旦使用了字符串,就应该使用src
格式说明符和%s
来打印字符串。
答案 2 :(得分:1)
target = malloc(10);
有内存来容纳字符串和nul终止符。我不明白你为src
分配内存的原因,因为我看到你正在使用字符串文字。只需为目标分配足够的内存,并strcpy()
确保您没有写入数组越界。
正确的方法是
target = malloc((strlen(src) + 1));
记下你做的时候
char *src = "Test";
字符串"Test"
存储在只读位置,此位置的地址返回src
。所以你的字符串已经在内存中了,你不需要为此再次分配内存,而你正在尝试做错误的操作。所以摆脱malloc()
src
答案 3 :(得分:1)
man strcpy
说明
strcpy()函数将src指向的字符串(包括终止空字节('\ 0'))复制到dest指向的缓冲区。
因此,如果src已经存在,则不必添加空终止字节。
BUGS
如果strcpy()的目标字符串不够大,则可能发生任何事情。
所以:
char *src = "Test"; // 4 chars + '\0'
target = malloc(sizeof(char)); // Space for 1 char
strcpy(target,src); // Woops !
答案 4 :(得分:1)
到目前为止,答案已经解决了代码中的缺陷和明显的误解,而不是你的问题。指向内存的指针可以像数组一样编入索引,因此给出:
char *target = malloc( 10 ) ;
可以这样设置元素:
target[0] = '\0' ;
答案 5 :(得分:0)
Sourav Ghosh的回答是正确的,但对于这种特殊情况,您应该使用strdup(),因为它会为您处理内存分配和复制:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
const char *src = "Test"; // You should make this const
char *target = strdup(src); // Duplicate
if (target == NULL) { // Check
return EXIT_FAILURE;
}
printf("%s\n", target);
return EXIT_SUCCESS;
}