请告诉我,将分配的字符数组复制到“普通”字符数组的正确方法是什么? 我试图做到以下几点,但它失败:将分配的字符数组复制到“普通”字符数组
char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work
请告诉我,将分配的字符数组复制到“普通”字符数组的正确方法是什么? 我试图做到以下几点,但它失败:将分配的字符数组复制到“普通”字符数组
char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work
首先,您不应该使用返回值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;
}
然而,在C++中投射'malloc'的返回值是必要的。 – 2012-02-08 13:48:47
尽管C++标签,这几乎肯定是一个C的问题。你很少需要在C++中使用malloc或C风格的字符串。 – paxdiablo 2012-02-08 13:59:13
你可能想要的是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
您没有终止NUL
字符在buf
。你应该确保做buf[last_actually_used_char+1] = '\0';
。这意味着buf
必须比您希望存储的数据大一个字符。
这是必要的,因为strcpy
通过搜索终止NUL
找到要复制的信息的长度。
我强烈鼓励使用更安全strncpy
,或者如果你只是想复制数据(无'\0'
必要)更快,更安全memcpy
。
strcpy
使用零终止的字符串,而不是任意的内存块。
如果您填充了一个已终止的字符串,则strcpy
应该可以工作;如果没有,请提供更多关于“不起作用”的信息。
如果你不想结束的字符串,然后使用memcpy
:
memcpy(temp, buf, BUFSIZ);
注意,没有必要通过sizeof(char)
倍增,因为这是1定义。
如果您实际上正在编写C++,那么您可能想要使用std::vector
或std::string
而不是乱搞原始内存。
strcpy
是复制一个字符串的函数。
字符串是由空字符终止并包含空字符的字符序列。
char *buf = malloc(BUFSIZ);
这malloc
呼叫分配的char
阵列BUFSIZ但这不是一个字符串。 要复制阵列使用memcpy函数:
memcpy(temp, buf, BUFSIZ);
如果你的数组保存一个字符串(以空字符结尾的字符序列),然后您可以使用strcpy
复制。
你想完成什么?还要注意,通过C标准,char等于一个字节,所以'* sizeof(char)'不是必需的。 – 2012-02-08 13:42:51
使用'memcpy',因为您不必分析缓冲区并搜索0结束符 – valdo 2012-02-08 13:43:12
您应该提供更多信息,指出您认为strcpy不起作用(例如,printf未显示您期望的内容等) – dasblinkenlight 2012-02-08 13:43:24