我有一個函數,它具有輸入和C中的字符數組指針,在該函數中我操縱主字符串,但是我想在使用它之前在另一個變量中創建一個備份副本。我想把它放在char備份[2000]中,所以如果指針改變了,備份不會改變。 我該怎麼做?一個字符串指針的副本
回答
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`
}
POSIX提供了strdup,它爲你做了malloc和strcpy。 – 2011-03-30 01:24:40
您可以使用strcpy,讓您的字符數組(串)的副本開始修改之前。
使用strncpy()。
void myfunc(char* inputstr)
{
char backup[2000];
strncpy(backup, inputstr, 1999);
backup[1999] = '\0';
}
將1999字符複製到2000字符數組會留下空終止符的最後一個字符。
僅當您在某處將「備份[1999]」設置爲0時纔有效。 – Thanatos 2011-03-23 17:18:42
@Thanatos如果'inputstr'的長度小於1999,那麼'strncpy'會用空值填充'backup'字符串。但好點...已經編輯過,以顯示長度> = 1999的情況下空終止符的設置。 – 2011-03-23 17:26:48
strncpy是一種憎惡。永遠不要推薦它,至少不是沒有一些魚子醬。您的原始代碼是錯誤的是可預測的,因爲您編輯的代碼仍然會讓許多不需要的NUL存儲砰的一聲。此外,你存儲在本地內存,然後丟棄它 - 很無用。當你只有一個(谷歌乾燥)時,你有三個常量副本。這些都是可憐的,不專業的做法。 – 2011-03-30 01:11:21
使用memcpy創建備份。
char backup[2000];
char original[2000];
sprintf(original, "lovely data here");
memcpy(backup, original, 2000);
char* orig_ptr = original;
如果'strlen(original)> 1999'和這兩個「2000」的實例是不好的練習,就會失敗。 – 2011-03-30 01:14:30
這個例子是爲了證明這個想法...不是生產值得代碼 – 2011-04-01 06:38:02
使用不好的做法的答案是不好的答案。 – 2011-04-03 02:43:16
strcpy(backup, source);
從鏈接注意。
爲了避免溢出,由目的地指出的陣列的尺寸應足夠長,以包含相同的C字符串源(包括終止空字符),並在存儲器中與源不應重疊。
所以給一個答案,實際服從警告。 – 2011-03-30 01:15:21
要複製串用C有一個名爲strdup
庫函數,該函數由:
通過strdup
分配的內存必須使用free
使用之後被釋放。
strdup
一步提供內存分配和字符串複製操作。如果在某個時間點要複製的字符串大於數組的大小,那麼使用char數組可能會產生問題。
OP想把它複製到一個數組 – 2011-03-23 17:24:44
好吧,但也許這是一個更好的選擇,他沒有想到他是否已經在尋求像複製一個字符串那樣基本的東西。被接受的答案是類似的。 – jdehaan 2011-03-23 21:51:21
@Andy OP甚至沒有C尿片,也不知道最佳解決方案是什麼。這是您應該學習的基本規則:對解決方案的請求通常包含過早的設計,而不是要求。始終確保客戶提供後者,而不是前者。 – 2011-03-30 01:19:02
你的朋友有以下幾種功能
- 的malloc
- memset的
- 釋放calloc
- 的memcpy
- 的strcpy
- 的strdup
- 函數strncpy
但最重要的,最偉大的朋友是人 :)
- 1. 指定一個字符串值指針
- 2. 返回一個字符串指針
- 3. Ç指定字符串指針到其他字符串指針
- 4. 指定副本指針
- 5. 字符串指針
- 6. 將一個字符串從一個指針複製到另一個指針
- 7. C函數大寫指針字符串的第一個字符
- 8. 複製字符串指針,指針
- 9. 從一個字符串指針數組複製字符串到另一個
- 10. 是一個常量字符指針,指向一個常量字符或指向字符的常量指針嗎?
- 11. 可以有兩個指針指向同一個字符串嗎?
- 12. 字符串副本(strcpy)
- 13. scanf字符指針中的字符串
- 14. 指定一個指針的字符串引用
- 15. 字符串數組指針只傳遞一個字符
- 16. 從函數返回一個字符串[字符指針]
- 17. 使用指向字符串的指針數組替換字符串中的另一個子字符串
- 18. 使用指向字符串的指針初始化指向字符串中的字符的指針
- 19. C字符串和指針
- 20. 指針 - 字符串C++
- 21. 字符串指針功能
- 22. 字符串和指針
- 23. C,指針,字符串
- 24. 指針和字符串
- 25. c字符串指針
- 26. c字符串指針
- 27. 字符串指針修改
- 28. C字符串和指針
- 29. 字符串指針和strcpy
- 30. Wrtiting字符串內存流 - 指向字符串的指針
請發表您的代碼 – 2011-03-23 16:58:20
查找一個叫函數strncpy功能。 – GWW 2011-03-23 17:00:49
@GWW'strncpy'是一種憎惡。正確的方法是在字符串上使用strlen以確保它適合緩衝區,然後使用strcpy(buffer,string)或memcpy(buffer,string,len + 1)(後者在許多體系結構中更快)。 – 2011-03-30 01:07:35