从第一个字符串中的第二个字符串中删除所有出现的所有字符

时间:2013-09-18 17:36:35

标签: c linux unix system

我有一个小问题。 我有一个函数,它接受两个参数(两个字符串)。例如: String1 =“你好” String2 =“leo” 我需要删除String1中String2的所有字符。在这种情况下,我的最终结果应该是:“h”。这样做时我需要合并指针!到目前为止我已经有了这个代码,但它只是从“你好”中删除了“e”。我不知道为什么它不起作用。如果有人有更好或更有效的方法,请帮助!

void rmstr(char str1[], char str2[])
{

//Pointers to traverse two strings
char *p_str1 = &str1[0];
char *p_skip;
int length = (int)strlen(str2); 
int i;

while(*p_str1 != '\0')
{
    for (i = 0; i < length; i++) 
    {
        if(*p_str1 == str2[i])
        {
            for(p_skip = p_str1; *p_skip == str2[i]; ++p_skip);
            memcpy(p_str1, p_skip, &str1[strlen(str1)+1] - p_skip);
        }

        if(*p_str1 != '\0')
        {
            ++p_str1;
        }
    }
}
}

void rmstr(char str1[], char str2[]) { //Pointers to traverse two strings char *p_str1 = &str1[0]; char *p_skip; int length = (int)strlen(str2); int i; while(*p_str1 != '\0') { for (i = 0; i < length; i++) { if(*p_str1 == str2[i]) { for(p_skip = p_str1; *p_skip == str2[i]; ++p_skip); memcpy(p_str1, p_skip, &str1[strlen(str1)+1] - p_skip); } if(*p_str1 != '\0') { ++p_str1; } } } }

2 个答案:

答案 0 :(得分:1)

char* rmstr(char *str1, char *str2, char *ans) {
    char *p1 = str1;
    char *p2 = str2;
    char *res = ans;

    while (*p1 != '\0') {
        p2 = str2;
        while (*p2 != '\0') {
            if (*p1 == *p2)    // A character in str1 is found inside str2
                break;
            p2++;
        }
        if (*p2 == '\0') {   // No match found
            *ans = *p1;
            ans++;
        }
        p1++;
    }
    *ans = '\0';
    return res;
}

测试代码:

int main(void) {
    char str1[] = "hello";
    char str2[] = "elo";
    char ans[10];

    printf(rmstr(str1, str2, ans));

    return 0;
}

答案 1 :(得分:0)

嗯,这个答案变量少,可能更容易阅读。

    #include "stdio.h"

    /* check if c belongs to the second str */
    int char_belong_to_str(char c, char *str)
    {
        while(*str)
            if (c == *str++)
                    return 1;

        return 0;
    }

    void rmstr(char str1[], char str2[])
    {
        int result_len = 0;   /* saves the result str len*/
        char * p_new = str1;

        while (*str1)
        {
            char c = *str1;
            if (!char_belong_to_str(c, str2)) /* if not found in str2, save it*/
            {
                *(p_new + result_len) = c;
                ++result_len;
            }
            ++str1;
        }
        *(p_new+result_len) = '\0';

        printf("%s \n", p_new);
    }

    int main()
    {
        char  p1[] = "hello";
        char  p2[] = "elo";

        rmstr(p1, p2);
        return 0;
    }