0

请告诉我,将分配的字符数组复制到“正常”字符数组的正确方法是什么?我尝试执行以下操作,但失败了:

char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work
4

5 回答 5

1

您可能想要的是strncpy(),它从字符串中复制最多一定数量的字节。

strncpy(temp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string

如果那也失败了,可能只是使用memcpy()

memcpy(tmp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string
于 2012-02-08T13:44:45.250 回答
1

strcpy适用于以零结尾的字符串,而不是任意的内存块。

如果你用终止的字符串填充它,那么strcpy应该可以工作;如果没有,请提供有关它如何“不起作用”的更多信息。

如果您不想要终止的字符串,请使用memcpy

memcpy(temp, buf, BUFSIZ);

请注意,不需要乘以sizeof(char),因为根据定义,它是 1。

如果您实际上是在编写 C++,那么您可能想要使用std::vectorstd::string不使用原始内存。

于 2012-02-08T13:45:24.593 回答
1

首先,您不应该转换malloc(无论如何在 C 中)的返回值,因为它可以隐藏错误。

其次,你永远不需要乘以,sizeof(char)因为它总是保证为一——这样做会阻塞你的代码。

而且,对于实际问题,您可以使用:

memcpy (temp, buff, BUFFSZ);

复制整个字符数组。

我假设这就是你想要的,因为你没有提到处理 C“字符串”,只有一个字符数组。

如果您确实处理 C 字符串,那么strcpy在这种情况下可以正常工作,前提是:

  • 您在缓冲区的末尾有空间用于终止零字节;和
  • 你实际上已经零字节放在那里了。

例如,这个小片段可以正常工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {
    // Two buffers.

    char buff1[4];
    char *buff2 = malloc (4);
    if (buff2 == NULL) {
        puts ("No memory!");
        return 1;
    }

    // Populate first buffer.

    buff2[0] = 'p';
    buff2[1] = 'a';
    buff2[2] = 'x';
    buff2[3] = '\0';

    // Transfer and print.

    strcpy (buff1, buff2);
    puts (buff1);

    // Free and exit.

    free (buff2);
    return 0;
}
于 2012-02-08T13:47:16.567 回答
1

strcpy是一个复制字符串的函数。

字符串是由空字符终止并包含空字符的字符序列。

 char *buf = malloc(BUFSIZ);

malloc调用分配了一个数组 BUFSIZ,char但这不是一个字符串。要复制数组,请使用 memcpy 函数:

memcpy(temp, buf, BUFSIZ);

如果您的数组包含一个字符串(以空字符结尾的字符序列),您可以使用strcpy它来复制它。

于 2012-02-08T13:50:50.390 回答
0

NULbuf. 你应该确保这样做buf[last_actually_used_char+1] = '\0';。这意味着buf必须比您希望存储的数据大一个字符。

这是必要的,因为strcpy通过搜索终止来查找要复制的信息的长度NUL

我强烈建议使用更安全的strncpy,或者如果你只是想复制数据(没有'\0'必要)更快更安全memcpy

于 2012-02-08T13:45:06.427 回答