請告訴我,將分配的字符數組複製到「普通」字符數組的正確方法是什麼? 我試圖做到以下幾點,但它失敗:將分配的字符數組複製到「普通」字符數組
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