比方說,我有一個char *example
,它包含20個字符。我想從example[5]
刪除每個字符到example[10]
,然後修復陣列,以便example[11]
緊接在example[4]
之後。刪除C中給定位置的子字符串
基本上將刪除區域後面的所有字符移動到刪除區域開始的位置。
任何想法?
編輯:我想可能有一種方法使用memcpy?但我不知道該怎麼做。在一個循環中
比方說,我有一個char *example
,它包含20個字符。我想從example[5]
刪除每個字符到example[10]
,然後修復陣列,以便example[11]
緊接在example[4]
之後。刪除C中給定位置的子字符串
基本上將刪除區域後面的所有字符移動到刪除區域開始的位置。
任何想法?
編輯:我想可能有一種方法使用memcpy?但我不知道該怎麼做。在一個循環中
您不能可靠地使用memcpy()
,因爲源和目標之間存在重疊;你可以使用memmove()
。既然你知道長度,你可以使用:
memmove(&example[5], &example[11], (20 - 11 + 1));
記住你也需要複製null結束符。
#include <string.h>
#include <stdio.h>
int main(void)
{
char array[] = "abcdefghijklmnopqrst";
char *example = array;
printf("%.2zu: <<%s>>\n", strlen(example), example);
memmove(&example[5], &example[11], (20 - 11 + 1));
printf("%.2zu: <<%s>>\n", strlen(example), example);
return(0);
}
與C99編譯器編譯,國債收益率:
20: <<abcdefghijklmnopqrst>>
14: <<abcdelmnopqrst>>
如果你有C89編譯器(更具體地說,C庫),你就必須在格式字符串擔心z
,這表示size_t
參數。刪除z
最簡單,並將strlen()
的結果與(unsigned)
對齊。
哎呀,你會更快... – wildplasser
謝謝,這個作品如此出色! – Aneem
任何想法?
我會準備一個並行數組,複製源數組中的所有字符,但忽略指定範圍內的那些字符。或者,可以釋放源數組使用的內存,如果它不在堆棧上。
擾流板:
void cut_the_string(char *str, size_t cutpos, size_t cutlen)
{
size_t len;
len = strlen(str);
if (cutpos >= len) return;
if (cutpos + cutlen > len) cutlen = len-cutpos;
memmove(str+cutpos, str+cutpos+cutlen, 1+len - cutpos - cutlen);
return;
}
memmove(&example[5], &example[11], strlen(example) - 11 + 1);
注意的memcpy
的行爲是不確定的,當內存塊重疊,所以memmove
是比較合適的位置。
memcpy()僅適用於非重疊數組。你需要memmove()。 – 2012-09-15 20:26:01