簡體   English   中英

從 C 中的字符串中刪除子字符串

[英]Remove a substring from a string in C

我想從字符串中刪除一個特定的子字符串,例如我的主字符串是"ababccdabce"並且我想從中刪除"abc"所以它會變成"abcde"

我只是想知道 C 中是否有一個預定義的函數可以做到這一點,如果沒有,該怎么做?

C 中沒有預定義的函數可以從 C 字符串中刪除給定的子字符串,但您可以使用strstrmemmove編寫一個。 請注意,如果您原地刪除子字符串,則不能使用memcpystrcpy因為如果源數組和目標數組重疊,它們將具有未定義的行為。

這是代碼:

#include <string.h>

char *strremove(char *str, const char *sub) {
    size_t len = strlen(sub);
    if (len > 0) {
        char *p = str;
        while ((p = strstr(p, sub)) != NULL) {
            memmove(p, p + len, strlen(p + len) + 1);
        }
    }
    return str;
}

請注意,結果字符串可能包含子字符串,就像您的示例中的情況一樣。

Netherwire建議進行優化:

char *strremove(char *str, const char *sub) {
    size_t len = strlen(sub);
    if (len > 0) {
        char *p = str;
        size_t size = 0;
        while ((p = strstr(p, sub)) != NULL) {
            size = (size == 0) ? (p - str) + strlen(p + len) + 1 : size - len;
            memmove(p, p + len, size - (p - str));
        }
    }
    return str;
}

進一步磨練代碼,我想出了一個使用 2 指法的更有效的版本:只在第一場比賽之后開始的比賽之間復制片段:

char *strremove(char *str, const char *sub) {
    char *p, *q, *r;
    if (*sub && (q = r = strstr(str, sub)) != NULL) {
        size_t len = strlen(sub);
        while ((r = strstr(p = r + len, sub)) != NULL) {
            memmove(q, p, r - p);
            q += r - p;
        }
        memmove(q, p, strlen(p) + 1);
    }
    return str;
}

這是相同的方法,沒有調用memmove

char *strremove(char *str, const char *sub) {
    char *p, *q, *r;
    if (*sub && (q = r = strstr(str, sub)) != NULL) {
        size_t len = strlen(sub);
        while ((r = strstr(p = r + len, sub)) != NULL) {
            while (p < r)
                *q++ = *p++;
        }
        while ((*q++ = *p++) != '\0')
            continue;
    }
    return str;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM