2011-03-23 86 views
7

我有一個函數,它具有輸入和C中的字符數組指針,在該函數中我操縱主字符串,但是我想在使用它之前在另一個變量中創建一個備份副本。我想把它放在char備份[2000]中,所以如果指針改變了,備份不會改變。 我該怎麼做?一個字符串指針的副本

+0

請發表您的代碼 – 2011-03-23 16:58:20

+0

查找一個叫函數strncpy功能。 – GWW 2011-03-23 17:00:49

+0

@GWW'strncpy'是一種憎惡。正確的方法是在字符串上使用strlen以確保它適合緩衝區,然後使用strcpy(buffer,string)或memcpy(buffer,string,len + 1)(後者在許多體系結構中更快)。 – 2011-03-30 01:07:35

回答

11
void function (const char *string) 
{ 
    char *stringcopy = malloc (1 + strlen (string)); 
    if (stringcopy) 
     strcpy (stringcopy, string); 
    else fprintf (stderr, "malloc failure!"): 
    ... 
    do whatever needs to be done with `stringcopy` 
} 
+4

POSIX提供了strdup,它爲你做了malloc和strcpy。 – 2011-03-30 01:24:40

0

您可以使用strcpy,讓您的字符數組(串)的副本開始修改之前。

1

使用strncpy()。

void myfunc(char* inputstr) 
{ 
    char backup[2000]; 
    strncpy(backup, inputstr, 1999); 
    backup[1999] = '\0'; 
} 

將1999字符複製到2000字符數組會留下空終止符的最後一個字符。

+0

僅當您在某處將「備份[1999]」設置爲0時纔有效。 – Thanatos 2011-03-23 17:18:42

+0

@Thanatos如果'inputstr'的​​長度小於1999,那麼'strncpy'會用空值填充'backup'字符串。但好點...已經編輯過,以顯示長度> = 1999的情況下空終止符的設置。 – 2011-03-23 17:26:48

+1

strncpy是一種憎惡。永遠不要推薦它,至少不是沒有一些魚子醬。您的原始代碼是錯誤的是可預測的,因爲您編輯的代碼仍然會讓許多不需要的NUL存儲砰的一聲。此外,你存儲在本地內存,然後丟棄它 - 很無用。當你只有一個(谷歌乾燥)時,你有三個常量副本。這些都是可憐的,不專業的做法。 – 2011-03-30 01:11:21

0

使用memcpy創建備份。

char backup[2000]; 
char original[2000]; 

sprintf(original, "lovely data here"); 
memcpy(backup, original, 2000); 

char* orig_ptr = original; 
+0

如果'strlen(original)> 1999'和這兩個「2000」的實例是不好的練習,就會失敗。 – 2011-03-30 01:14:30

+0

這個例子是爲了證明這個想法...不是生產值得代碼 – 2011-04-01 06:38:02

+0

使用不好的做法的答案是不好的答案。 – 2011-04-03 02:43:16

0

strcpy reference.

strcpy(backup, source); 

從鏈接注意。

爲了避免溢出,由目的地指出的陣列的尺寸應足夠長,以包含相同的C字符串源(包括終止空字符),並在存儲器中與源不應重疊。

+0

所以給一個答案,實際服從警告。 – 2011-03-30 01:15:21

9

要複製串用C有一個名爲strdup庫函數,該函數由:

通過strdup分配的內存必須使用free使用之後被釋放。

strdup一步提供內存分配和字符串複製操作。如果在某個時間點要複製的字符串大於數組的大小,那麼使用char數組可能會產生問題。

+0

OP想把它複製到一個數組 – 2011-03-23 17:24:44

+3

好吧,但也許這是一個更好的選擇,他沒有想到他是否已經在尋求像複製一個字符串那樣基本的東西。被接受的答案是類似的。 – jdehaan 2011-03-23 21:51:21

+3

@Andy OP甚至沒有C尿片,也不知道最佳解決方案是什麼。這是您應該學習的基本規則:對解決方案的請求通常包含過早的設計,而不是要求。始終確保客戶提供後者,而不是前者。 – 2011-03-30 01:19:02

2

你的朋友有以下幾種功能

  • 的malloc
  • memset的
  • 釋放calloc
  • 的memcpy
  • 的strcpy
  • 的strdup
  • 函數strncpy

但最重要的,最偉大的朋友是 :)