请告诉我,将分配的char数组复制到“normal”char数组的正确方法是什么? 我试图执行以下操作,但它失败了:
char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work
答案 0 :(得分: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
答案 1 :(得分:1)
strcpy
使用零终止字符串,而不是任意内存块。
如果你用终止字符串填充它,那么strcpy
应该有效;如果没有,请提供更多信息,说明它“不起作用”。
如果您不想要终止字符串,请使用memcpy
:
memcpy(temp, buf, BUFSIZ);
请注意,无需乘以sizeof(char)
,因为根据定义,这是1。
如果您实际上是在编写C ++,那么您可能希望使用std::vector
或std::string
而不是使用原始内存。
答案 2 :(得分: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;
}
答案 3 :(得分:1)
strcpy
是一个复制字符串的函数。
字符串是由空字符终止并包含空字符的字符序列。
char *buf = malloc(BUFSIZ);
此malloc
调用分配char
的数组BUFSIZ,但这不是字符串。
要复制数组,请使用memcpy函数:
memcpy(temp, buf, BUFSIZ);
如果您的数组包含一个字符串(由空字符终止的字符序列),则可以使用strcpy
复制它。
答案 4 :(得分:0)
NUL
中没有终止buf
字符。你应该确保buf[last_actually_used_char+1] = '\0';
。这意味着buf
必须比您希望存储的数据大一个字符。
这是必要的,因为strcpy
通过搜索终止NUL
来查找要复制的信息的长度。
我强烈建议您使用更安全的strncpy
,或者如果您只想复制数据(不需要'\0'
),则更快更安全memcpy