当使用strcpy时,如何将null终止符添加到char指针

时间:2015-02-23 14:39:04

标签: c pointers char malloc strcpy

我有一个试图使用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;
}

6 个答案:

答案 0 :(得分:9)

你不需要。 strcpy()的第二个参数需要nul终止,第一个参数需要符合源+ nul终止符中的字符数。

您的代码中的问题是:

  1. 您正在以错误的方式使用sizeof运算符,并且通过再次为其分配内存来覆盖src指针。

    要获得所需字符串的长度strlen(),您不需要在每个指针上调用malloc()

    您正在获取垃圾值,因为您正在从未初始化的数据进行复制,因为src指向新分配的空间,因为

    src = malloc(sizeof(char));
    

    你不应该这样做。

  2. sizeof(char) == 1根据定义,所以你只为1个字节分配空间,如果它是一个有效的C字符串,则必须是'\0'因为只有1个空间字符。

  3. 字符串的正确printf()说明符为"%s",您使用"%c"表示字符。

  4. 正确的方法是

    #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必须足够大才能接收副本

所以,只要

  1. 您的源是一个正确的以null结尾的char数组( string
  2. 目的地有足够的内存来容纳来源
  3. 你很高兴。所以,你要

    1. null - 终止dest数组。
    2. src分配足够的内存,以便它可以容纳target的内容。
    3. 最后,要提及的是,一旦使用了字符串,就应该使用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;
}