2014-12-06 72 views
-5

這是我在stackoverflow上的第一個問題,因爲我在解決子字符串刪除時遇到了一定的困難。一些幫助將不勝感激。 例如:char * string =「通過鑰匙孔偷看猴子」char * substring =「key」。輸出結果應該類似於「通過孔窺視」。任何人有任何線索?我不確定如何在不使用strtok的情況下將每個單詞與該子字符串進行比較。任何建議將非常感激。非常感謝:)從C中的每個字符串中刪除一個子字符串(如果它包含它)

+3

爲什麼不發表您嘗試使用 – 2014-12-06 12:36:21

+0

'strstr'。並創建新的結果字符串。 – BLUEPIXY 2014-12-06 12:44:53

回答

0

考慮使用strstrmemmove

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char s[] = "monkey peep through the keyhole"; 
    char k[] = "key"; 

    size_t m = strlen(k); /* length of key        */ 
    char *p;    /* pointer to start of key in string   */ 

    while (NULL != (p = strstr(s, k))) 
    { 
    char *q = p + m;  /* pointer to part after key in string  */ 
    size_t n = strlen(q); /* length of part after key in string  */ 
    memmove(p, q, n + 1); /* copy part after key in string 
           plus terminating '\0' (!) to start of key */ 
    } 

    puts(s); 
    return EXIT_SUCCESS; 
} 

就像一個魅力:

$ clang test.c 

$ ./a.out 
mon peep through the hole 

,但有點低效,因爲關鍵的每一次出現,我們開始從開始搜索字符串。幸運的是,爲了避免二次複雜性,我們只需要有點聰明:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char s[] = "monkey peep through the keyhole"; 
    char k[] = "key"; 

    size_t m = strlen(k); 
    char *p = s; 

    while (NULL != (p = strstr(p, k))) 
    { 
    char *q = p + m; 
    size_t n = strlen(q); 
    memmove(p, q, n + 1); 
    } 

    puts(s); 
    return EXIT_SUCCESS; 
} 

在循環的第一次迭代,我們現在開始從字符串的開始搜索;在下面的迭代中,我們開始從先前刪除鍵的出現之後的部分搜索。

這種做法現在使一個不錯的效用函數:

char *remsubstrs(char *s, const char *k) 
{ 
    size_t m = strlen(k); 
    char *p = s; 

    while (NULL != (p = strstr(p, k))) 
    { 
    char *q = p + m; 
    size_t n = strlen(q); 
    memmove(p, q, n + 1); 
    } 

    return s; 
} 
+0

非常感謝這些見解,這些註釋對於讓我明白我應該如何考慮刪除子字符串非常有幫助。所有的答案一般都很棒:) – Snappy 2014-12-06 17:08:00

0
char *string ="monkey peep through the keyhole"; 
char temp[512]; 
int i,j; 

memset(temp , 0, 512); 
for(i=0,j=0;i<strlen(string);i++) 
{ 
    if(((string[i] == 'K')||(string[i] == 'k'))&&((string[i+1] == 'E')||(string[i] == 'e'))&& (string[i+2] == 'Y')||(string[i+2] == 'y')) 
    { 
     //do nothing 
     i= i+2; 
    } 
    else 
    { 
     temp[j] = string[i]; 
     j++; 
    } 
} 
printf("\n%s\n",temp); 

你可以使用這個邏輯與out使用substr。

1
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char *string = "monkey peep through the keyhole"; 
    char *substring= "key"; 
    size_t slen = strlen(substring); 
    char *p, *s = string; 
    while(*s){ 
     p = strstr(s, substring); 
     if(p == NULL){ 
      puts(s); 
      break; 
     } else { 
      while(s != p) 
       putchar(*s++); 
      s += slen; 
     } 
    } 
} 
相關問題