2012-02-08 24 views
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 
+1

你想完成什麼?還要注意,通過C標準,char等於一個字節,所以'* sizeof(char)'不是必需的。 – 2012-02-08 13:42:51

+3

使用'memcpy',因爲您不必分析緩衝區並搜索0結束符 – valdo 2012-02-08 13:43:12

+0

您應該提供更多信息,指出您認爲strcpy不起作用(例如,printf未顯示您期望的內容等) – dasblinkenlight 2012-02-08 13:43:24

回答

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; 
} 
+0

然而,在C++中投射'malloc'的返回值是必要的。 – 2012-02-08 13:48:47

+0

儘管C++標籤,這幾乎肯定是一個C的問題。你很少需要在C++中使用malloc或C風格的字符串。 – paxdiablo 2012-02-08 13:59:13

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 
0

您沒有終止NUL字符在buf。你應該確保做buf[last_actually_used_char+1] = '\0';。這意味着buf必須比您希望存儲的數據大一個字符。

這是必要的,因爲strcpy通過搜索終止NUL找到要複製的信息的長度。

我強烈鼓勵使用更安全strncpy,或者如果你只是想複製數據(無'\0'必要)更快,更安全memcpy

1

strcpy使用零終止的字符串,而不是任意的內存塊。

如果您填充了一個已終止的字符串,則strcpy應該可以工作;如果沒有,請提供更多關於「不起作用」的信息。

如果你不想結束的字符串,然後使用memcpy

memcpy(temp, buf, BUFSIZ); 

注意,沒有必要通過sizeof(char)倍增,因爲這是1定義。

如果您實際上正在編寫C++,那麼您可能想要使用std::vectorstd::string而不是亂搞原始內存。

1

strcpy是複製一個字符串的函數。

字符串是由空字符終止幷包含空字符的字符序列。

char *buf = malloc(BUFSIZ); 

malloc呼叫分配的char陣列BUFSIZ但這不是一個字符串。 要複製陣列使用memcpy函數:

memcpy(temp, buf, BUFSIZ); 

如果你的數組保存一個字符串(以空字符結尾的字符序列),然後您可以使用strcpy複製。

相關問題