[英]Remove a substring from a string with memmove in C
我正在嘗試實現一個函數,用memmove從字符串中刪除子字符串。 打印輸出結果時,即使我在源字符串中使用了正確的位置,我似乎也沒有正確移動子字符串。 我的職能是:
char * removeSubStr(char * str, const char * substr){
char *scan_p, *temp_p;
int subStrSize = strlen(substr);
if (str == NULL){
return 0;
}
else if (substr == NULL){
return str;
}
else if (strlen(substr)> strlen(str)){
return str;
}
temp_p = str;
while(scan_p = strstr(temp_p,substr)){
temp_p = scan_p + subStrSize;
memmove(scan_p, temp_p, sizeof(temp_p)+1);
}
return str;
}
例如,我的輸出是:如果發送字符串“ please remove rem remove rem999”,我會回來:“ please ove rm ovmove re 999”
謝謝!
下列:
while(scan_p = strstr(temp_p,substr)){
temp_p = scan_p + subStrSize;
memmove(scan_p, temp_p, sizeof(temp_p)+1);
}
毫無意義。
您需要這樣的東西:
while( temp_p = strstr( temp_p, substr ) )
{
length = strlen( temp_p );
memmove( temp_p, temp_p + subStrSize, length - subStrSize + 1 );
}
注意:在我的答案的第一個版本中,我只是使用strlen()
,但是正如評論者所指出的那樣,由於該標准,這是不可取的。 (它仍然很可能起作用,因為我們是在復制而不是向上復制,但是最好不要通過違反標准來誘惑您的命運。)因此,這就是為什么我們需要memmove()
的原因。
請注意,可以使用多兩行代碼來對其進行優化,從而不必計算length = strlen( temp_p );
在循環的每次迭代中。 這種優化留給學生作為練習。
另請注意:
你最好做int subStrSize = strlen(substr);
在您檢查substr == NULL
;
沒有styrlen()
這樣的東西
sizeof(temp_p)
所做的事情與您認為的完全不同。
在這個循環中
temp_p = str;
while(scan_p = strstr(temp_p,substr)){
temp_p = scan_p + subStrSize;
memmove(scan_p, temp_p, `sizeof(temp_p)`+1);
}
有兩個錯誤。
第一個是,該循環的每次迭代后的指針temp_p
應等於該指針的值scan_p
因為字符串的尾部在該位置上移動。
第二個是這個表達
sizeof(temp_p)
產生char *
類型的對象的大小,而不是提供指針temp_p
指向的字符串的長度。
同樣,您的函數也經常調用函數strlen
。
至於整個功能設計,則該功能不應檢查參數之一是否等於NULL。 這是功能客戶端的任務。 標准的C字符串函數不進行這種檢查。
如示例程序所示,函數實現可以采用以下方式。
#include <stdio.h>
#include <string.h>
char * removeSubStr( char *str, const char *substr )
{
size_t m1 = strlen(str);
size_t m2 = strlen(substr);
if (!(m1 < m2))
{
for (char *p = str; (p = strstr(p, substr)) != NULL; )
{
size_t n = m1 - ( p + m2 - str );
memmove(p, p + m2, n + 1);
}
}
return str;
}
int main( void )
{
char s[] = "12A12B12C12D";
puts(s);
puts(removeSubStr(s, "12"));
return 0;
}
程序輸出為
12A12B12C12D
ABCD
sizeof(temp_p)
是char *
的大小,通常為4
您可能想寫strlen(temp_p)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.