Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除第一个字符串中第二个字符串中出现的所有字符_C_Linux_Unix_System - Fatal编程技术网

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

C 删除第一个字符串中第二个字符串中出现的所有字符,c,linux,unix,system,C,Linux,Unix,System,我有个小问题。 我有一个接受两个参数(两个字符串)的函数。例如: String1=“你好” String2=“狮子座” 我需要删除String1中String2的所有字符。在这种情况下,我的最终结果应该是:“h”。我需要合并指针时,这样做!到目前为止,我已经得到了这个代码,但它只是从“hello”中删除了“e”。我不知道为什么它不起作用。如果有人有更好或更有效的方法,请帮助 void rmstr(char str1[], char str2[]) { //Pointers to traver

我有个小问题。 我有一个接受两个参数(两个字符串)的函数。例如: String1=“你好” String2=“狮子座” 我需要删除String1中String2的所有字符。在这种情况下,我的最终结果应该是:“h”。我需要合并指针时,这样做!到目前为止,我已经得到了这个代码,但它只是从“hello”中删除了“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[]
{
//遍历两个字符串的指针
char*pu str1=&str1[0];
字符*p_跳过;
int长度=(int)strlen(str2);
int i;
而(*p_str1!='\0')
{
对于(i=0;i

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;
}

这个答案变量少,也许更容易阅读

    #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;
    }

您正在推进通过
str2
前进的
for
循环中的
p\u str1
指针。它应该在这个循环之外。你想过这个吗?很明显,您的代码只在两个字符串中查找相同偏移量的字符,这显然无法解决该任务。如果你给字符串起的名字与扮演的角色有关,你的代码会更清晰。。。第二个字符串只是一个无序的字符集合。我经常认为我的代码是不言自明的。很多时候,我错了。你可能想描述一下什么是不同的以及为什么。非常感谢!唯一的问题是,我假设使用指针遍历字符串。。。因此,尽管这个程序有效,但它并不完全是我想要的。谢谢你,先生!你太棒了。谢谢你的意见!