Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何可靠地将文本复制到char*而不出现任何错误_C_String_Malloc_Strcpy_Strncpy - Fatal编程技术网

如何可靠地将文本复制到char*而不出现任何错误

如何可靠地将文本复制到char*而不出现任何错误,c,string,malloc,strcpy,strncpy,C,String,Malloc,Strcpy,Strncpy,我有两个问题 对char*字符串执行以下命令时,是否需要添加终止字符 strcpy() strncpy() 在对char*字符串执行任何上述操作之前,是否需要分配内存 例如 char *str; str = malloc(strlen(texttocopy)); strcpy(texttocopy, str); // see the below edit 请解释一下 编辑: 在上面的代码中,我颠倒了参数。这只是我在这里提问时的打字错误。正确的方法应该是 strcpy(str, texttoco

我有两个问题

  • char*字符串执行以下命令时,是否需要添加终止字符

    strcpy()

    strncpy()

  • 在对
    char*字符串执行任何上述操作之前,是否需要分配内存

  • 例如

    char *str;
    str = malloc(strlen(texttocopy));
    strcpy(texttocopy, str); // see the below edit
    
    请解释一下

    编辑: 在上面的代码中,我颠倒了参数。这只是我在这里提问时的打字错误。正确的方法应该是

    strcpy(str, texttocopy); // :)
    
    该函数始终添加终止符,但在某些情况下可能不添加终止符

    对于第二个问题,是的,您需要确保为目标分配了足够的内存。在您的示例中,您没有分配足够的内存,因此会出现缓冲区溢出。请记住,返回字符串的长度而不计算终止符。您还将参数反转为strcpy,目标是第一个参数。

    函数始终添加终止符,但在某些情况下可能不添加终止符

    对于第二个问题,是的,您需要确保为目标分配了足够的内存。在您的示例中,您没有分配足够的内存,因此会出现缓冲区溢出。请记住,返回字符串的长度而不计算终止符。您还将参数反转为strcpy,目标是第一个参数

  • “strcpy”函数将数据从源地址复制到目标地址,包括带有“\0”终止字符的地址。”strncpy'函数以相同的方式复制数据,但如果要复制的前n个字节中不存在终止字符'\0',则不会复制终止字符,您需要自己添加终止字符以终止字符串

  • 您将始终必须静态或动态地分配一个内存空间来使用。因此,您应该首先声明一个字符数组或动态分配一块内存,然后才能更好地处理字符串

  • “strcpy”函数将数据从源地址复制到目标地址,包括带有“\0”终止字符的地址。”strncpy'函数以相同的方式复制数据,但如果要复制的前n个字节中不存在终止字符'\0',则不会复制终止字符,您需要自己添加终止字符以终止字符串

  • 您将始终必须静态或动态地分配一个内存空间来使用。因此,您应该首先声明一个字符数组或动态分配一块内存,然后才能更好地处理字符串


  • 我已经把
    malloc(strlen(texttocopy))
    。这将不会分配足够的内存?所以根据你的说法,我是否需要将其更改为
    malloc(strlen(texttocopy)+1)
    ?@BlueBird你需要
    strlen(texttocopy)+1
    @BlueBird并更改
    strcpy
    调用的参数。我已经将
    malloc(strlen(texttocopy))
    。这将不会分配足够的内存?因此,根据您的说法,我是否需要将其更改为
    malloc(strlen(texttocopy)+1)
    ?@BlueBird您需要
    strlen(texttocopy)+1
    @BlueBird并更改
    strcpy
    调用的参数。注意。。我急于阅读下面每秒钟编辑的答案注意。。我急于阅读下面每秒钟编辑的答案假设您需要10个字节,例如:静态分配:char buf[10];动态分配:char*buf=(char*)malloc(10);假设您需要10个字节,例如:静态分配:char buf[10];动态分配:char*buf=(char*)malloc(10);