2012-06-03 50 views
4

我有以下字符串ID is a sample string remove to /0.10,我想最後得到以下內容:ID/0.10更清潔的方式來刪除str中的子字符串C

這就是我想出來的。不過,我正在尋找一種更清潔/更好的方式來做到這一點。

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

int main() 
{ 
    char str[] = "ID is a sample string remove to /0.10"; 
    char *a = strstr(str, "ID"); 
    char *b = strrchr (str, '/'); 
    if (a == NULL) 
     return 0; 
    if (b == NULL) 
     return 0; 

    int p1 = a-str+2; 
    int p2 = b-str; 
    int remL = p2 - p1; 
    int until = (strlen(str) - p1 - remL) +1; 

    memmove (str+p1, str+(p1+remL), until); 
    printf ("%s\n",str); 
    return 0; 
} 
+0

右鍵我一直在尋找。謝謝! – Kayla

回答

3

確定ab後,您可以簡化memmove這樣的:

char str[] = "ID is a sample string remove to /0.10"; 
char *a = strstr(str, "ID"); 
char *b = strrchr (str, '/'); 
if ((a == NULL) || (b == NULL) || (b < a)) 
    return 0; 

memmove(a+2, b, strlen(b)+1); 

你的字符串長度做的計算是不是真的有必要。

+0

在這個版本中過度計算長度。 – Ruben

+0

不知道「/ ID」 –

+0

請在'memmove()'末尾修復冗餘支架。 – pevik

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

int main() 
{ 
char str[] = "ID is a sample string remove to /0.10"; 
char *a = strstr(str, "ID"); 
char *b = strrchr (str, '/'); 
if (a == NULL || b == NULL) 
    return 0; 
int dist = b - a; 
if (dist <= 0) return 0; // aware "/ ID" 

a += 2; 
while (*a ++ = *b ++); 

printf ("%s\n",str); 

return 0; 
} 

如果你喜歡一個非常密集的版本

char str[] = "ID is a sample string remove to /0.10"; 
char *a = strstr(str, "ID"); 
char *b = strrchr (str, '/'); 
if (a == NULL || b < a) return 0; // no need to test b against NULL, implied with < 
a ++; 
while (*(++ a) = *b ++); 
+0

你確定'while(* a ++ = * b ++);'的行爲是由C標準定義的嗎? – Ruben

+1

我很確定使用該片段的strcpy的早期實現。你在哪裏看到問題? (OK,你必須忽略警告)(另見http://stackoverflow.com/questions/7962159/strcpy-implementation-method) –

+2

沒有空格,它實際上是K&R strcpy():'while(* a ++ = * b ++);'。 – wildplasser

相關問題