![](/img/trans.png)
[英]Is it possible to change the buffer size used in a C library at compile time?
[英]change the size of one string in C, it is possible?
我已經閱讀了很多關於此的內容,但我無法理解,例如,我想要更改字符串的字符。
我們認為我有以下字符串:
char a [] = "stackoverflow"
然后我想在最后添加5個字母,或者刪除2個以上的字母等...獲取這樣的字符串:
char b [] = "stackoverflowstack"
char b [] = "stackoverfl"
我怎么能這樣做,請有人向我解釋,提前謝謝......
您可以使用動態內存分配與C庫調用,如malloc
。 這要求您有堆內存可用。 我不會進一步討論,因為有很多參考資料。
如果這不是一個選項,您將需要使用strncpy
並創建足夠大的數組來存儲部分結果。
例如,在您選擇的示例中:
const char* stackOverflow[] = "stackoverflow";
char a[20]; // Enough room for the largest possible string.
strncpy(a, stackOverflow, sizeof(a));
strncpy(a, "stackoverflowstack", sizeof(a)); // Copy null char as well
strncpy(a, "stackoverfl", sizeof(a)); // Copy null char as well
最簡單的方法是在數組中預先分配足夠的內存,以保存預期存儲在其中的最長字符串。
陣列是存儲區域; 它的大小(元素數量)固定在創建它的位置。 您無法擴展現有陣列 - 盡管您可以使用realloc
將陣列替換為較長的陣列。
字符串是一系列字符,包括終止的'\\0'
0'null字符。
數組可能包含一個字符串 - 字符串的長度與數組的大小不同。
請注意,字符串的長度不包括終止'\\0'
; `“你好”的長度為5, 大小為6。
你的聲明:
char a[] = "stackoverflow";
導致編譯器創建a
大小足以容納用於初始化它的字符串的大小。 它相當於:
char a[14] = "stackoverflow"; /* 13 characters + 1 for the '\0' */
您可以縮短存儲在數組a
的字符串,但它不能容納長度大於13的字符串:
strcpy(a, "STACK");
在此之后,數組a
大小仍為14個字符(從不更改),但其內容現在為:
"STACK\0verflow\0"
但是第一個'\\0'
之后的任何內容都可能會被忽略。
如果您預計存儲更長的字符串,則可以使用更大的字符串創建它:
char a[100] = "stackoverflow";
strcat(a, " is fun!";
這種方法既浪費(數組可能比目前需要的更大)又容易出錯(通過在其中存儲過長的字符串很難避免溢出數組邊界)。 但如果你足夠小心,它就足夠了。
有一些字符串操作函數可以更容易地避免溢出數組。 strncat
是一個更安全的strcat
版本,它允許您指定目標數組的大小。 還有一些非標准函數,如strlcpy
和strlcat
。
(但不建議使用 strncpy
。)
其他方法也是可能的。 例如,您可以使用malloc()
動態分配內存空間,並使用realloc
重新分配它(用更大或更小的數組替換您的數組)。 您仍然必須小心不要讀取或寫入數組的末尾 - 並且您必須自己跟蹤數組大小。 這是一種更靈活的方法,但它會對程序的性能和作為程序員的性能帶來更多的開銷。
C(與C ++不同,BTW)沒有簡單的機制來管理不同長度的字符串。 在某些情況下,C字符串工具是構建更高級別機制的基礎。
調整字符串大小的唯一方法是最初使用malloc()
動態分配它。
您無法調整靜態聲明的任何內容。
char * a = malloc(14);
a = realloc(a, 20);
(省略了相關的返回值檢查)
對於coure,你可以靜態地聲明一個足夠大的數組來保存最大的字符串(加上null終止符):
char a[20];
簡短的回答是否定的。
更長的答案:這些字符串的長度有限,你不能擴展它們。 但是你可以創建一個更長的字符串,然后在那里連接它們:
char* new_string = (char*) malloc((strlen(a) + strlen(b) + 1) * sizeof(char));
strcpy(new_string, a);
strcat(new_string, b);
printf("%s", new_string);
malloc(size_t len)
分配一塊內存長度為len
字節。 請注意,我分配的內存比所需的長一個字節:C字符串以空字節終止,並且不計入strlen,但它仍然是必需的。
strcpy(char * dst, const char * src)
將字符串從位置src
復制到位置dst
。 當dst
長度小於src
長度時,你可能並且可能會得到某種不良行為。
strcat(char * dst, const char * src)
在src
添加一個字符串到dst
的末尾。
你可以使用靜態內存分配(比如char new_string[20]
)而不是malloc,雖然它在某種程度上限制了你的字符串長度(顯然)並且可能導致緩沖區溢出:小心它。
進一步閱讀: 關於字符串處理的Wikibooks教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.