2012-09-15 29 views
0

比方說,我有一個char *example,它包含20個字符。我想從example[5]刪除每個字符到example[10],然後修復陣列,以便example[11]緊接在example[4]之後。刪除C中給定位置的子字符串

基本上將刪除區域後面的所有字符移動到刪除區域開始的位置。

任何想法?

編輯:我想可能有一種方法使用memcpy?但我不知道該怎麼做。在一個循環中

+1

memcpy()僅適用於非重疊數組。你需要memmove()。 – 2012-09-15 20:26:01

回答

3

您不能可靠地使用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)對齊。

+0

哎呀,你會更快... – wildplasser

+0

謝謝,這個作品如此出色! – Aneem

0
  1. 移字符OR
  2. 副本字符例如+ 11..example + 20,粘貼在例如+ 4 OR
  3. ....
0

任何想法?

我會準備一個並行​​數組,複製源數組中的所有字符,但忽略指定範圍內的那些字符。或者,可以釋放源數組使用的內存,如果它不在堆棧上。

1

擾流板:

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; 
} 
0
memmove(&example[5], &example[11], strlen(example) - 11 + 1); 

注意的memcpy的行爲是不確定的,當內存塊重疊,所以memmove是比較合適的位置。