簡體   English   中英

在C中改變一個字符串的大小,有可能嗎?

[英]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版本,它允許您指定目標數組的大小。 還有一些非標准函數,如strlcpystrlcat

(但不建議使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM