這是我在stackoverflow上的第一個問題,因爲我在解決子字符串刪除時遇到了一定的困難。一些幫助將不勝感激。 例如:char * string =「通過鑰匙孔偷看猴子」char * substring =「key」。輸出結果應該類似於「通過孔窺視」。任何人有任何線索?我不確定如何在不使用strtok的情況下將每個單詞與該子字符串進行比較。任何建議將非常感激。非常感謝:)從C中的每個字符串中刪除一個子字符串(如果它包含它)
-5
A
回答
0
考慮使用strstr
和memmove
:
#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;
}
}
}
相關問題
- 1. 刪除一個字符串,如果它包含一個條目
- 2. 刪除文件,如果它包含一個字符串
- 3. 刪除DOM元素,如果它包含一個字符串
- 4. 從一個字符串中刪除一個子字符串
- 5. 刪除字符串的第一個字符如果它等於
- 6. vba - 從每個字符串數組中刪除子字符串
- 7. 匹配一個字符串,但不包含它包含另一個字符串
- 8. c#檢查標籤,如果它包含一個字符串
- 9. 從一個字符串中刪除一個子字符串,使用memmove在C
- 10. 刪除陣列鍵時,它包含一個字符串在javascript
- 11. PHP - 如果一個字包含特定字符串替換它
- 12. 檢查一個字符串,如果它包含字母
- 13. 如何從字符串中刪除多個子字符串?
- 14. 刪除字符串中的第一個字符如果它是逗號
- 15. 刪除字符串中的第一個字符,如果它是0
- 16. 修剪一個字符串的結尾,如果它包含某個字符?
- 17. 如果字符串中的子字符串,通過從字符串結尾刪除它
- 18. 從包含問題的字符串中移除子字符串
- 19. 如何分割一個字符串,如果它包含句點(。)?
- 20. Python刪除字符串的最後一個字符,如果它的字母
- 21. 刪除一行,如果它包含CSV文件中的字符串
- 22. 如果它包含c中的格式,則替換字符串#
- 23. 刪除最後一個字符串,如果它的「‘
- 24. 從字符串中刪除多個子字符串 - Java
- 25. 從C中的字符串開頭刪除子字符串
- 26. 刪除包含字符串
- 27. 從c字符串中刪除字符
- 28. 從字符串中刪除字符C
- 29. C從字符串中刪除字符
- 30. C++從字符串中刪除字符
爲什麼不發表您嘗試使用 – 2014-12-06 12:36:21
'strstr'。並創建新的結果字符串。 – BLUEPIXY 2014-12-06 12:44:53