Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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_String_Pointers_While Loop - Fatal编程技术网

C从字符串中删除多个字母

C从字符串中删除多个字母,c,string,pointers,while-loop,C,String,Pointers,While Loop,我输入两个字符串(string1和string2)。我需要做的是从string1中删除字符串2中的所有字母。例如,string1=“abcdefghi”,string2=“afbdh”,output=“cegi”。现在它只删除一个字母 我试图循环*str3,但我认为在第一次迭代之后,*str2没有回到str3[0] void rmstr(char *str2, char *str3) { char *p=str2; printf("Old String: %s", str2);

我输入两个字符串(string1和string2)。我需要做的是从string1中删除字符串2中的所有字母。例如,string1=“abcdefghi”,string2=“afbdh”,output=“cegi”。现在它只删除一个字母

我试图循环*str3,但我认为在第一次迭代之后,*str2没有回到str3[0]

void rmstr(char *str2, char *str3)
{
    char *p=str2;

    printf("Old String: %s", str2);

    while(*str2)
    {
       if(*p != *str3)
           *str2++=*p;
       p++;
    }
}

这里的技巧是使用两个指针,一个用于阅读,一个用于写作:

char *r, *w;

r = w = str1;
while (*r) {
    if (strchr(str3, *r) == NULL) {
      ++w; // advance write pointer
    }
    ++r; // advance read pointer
}
*w = '\0'; // null terminate

或者,使用一个中间字符串,然后将其复制回str2。

这里的技巧是使用两个指针,一个用于读取,一个用于写入:

char *r, *w;

r = w = str1;
while (*r) {
    if (strchr(str3, *r) == NULL) {
      ++w; // advance write pointer
    }
    ++r; // advance read pointer
}
*w = '\0'; // null terminate

或者,使用一个中间字符串,然后将其复制回str2。

另一种方法:

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

void rmstr(char *str2, char *str3, char *str4)
{
    char *pch=NULL;
    int i=0,j=0;
    printf("Old String1: %s\n", str2);
    printf("Old String2: %s\n", str3);
    for(j=0;j<strlen(str2);j++)
    {
        char tmp[2] = {str2[j], '\0'};
        pch = strstr(str3, tmp);
        if (pch == NULL)
        {
            str4[i] = str2[j];
            i++;
        }

    }
    str4[i]='\0';
}

int main()
{   
    char str1[] = "abcdefghi";
    char str2[] = "afbdh";
    char str3[256];
    rmstr(str1,str2,str3);
    printf("New string is: %s\n",str3);
    return 0;
}
#包括
#包括
void rmstr(字符*str2,字符*str3,字符*str4)
{
char*pch=NULL;
int i=0,j=0;
printf(“旧字符串1:%s\n”,str2);
printf(“旧字符串2:%s\n”,str3);

对于(j=0;j另一种方法:

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

void rmstr(char *str2, char *str3, char *str4)
{
    char *pch=NULL;
    int i=0,j=0;
    printf("Old String1: %s\n", str2);
    printf("Old String2: %s\n", str3);
    for(j=0;j<strlen(str2);j++)
    {
        char tmp[2] = {str2[j], '\0'};
        pch = strstr(str3, tmp);
        if (pch == NULL)
        {
            str4[i] = str2[j];
            i++;
        }

    }
    str4[i]='\0';
}

int main()
{   
    char str1[] = "abcdefghi";
    char str2[] = "afbdh";
    char str3[256];
    rmstr(str1,str2,str3);
    printf("New string is: %s\n",str3);
    return 0;
}
#包括
#包括
void rmstr(字符*str2,字符*str3,字符*str4)
{
char*pch=NULL;
int i=0,j=0;
printf(“旧字符串1:%s\n”,str2);
printf(“旧字符串2:%s\n”,str3);

对于(j=0;j,这里没有指针

事实上,有很多解决方案可以做到这一点

我试过的一个在这里

        string fStr = "bhardwaj", sStr = "dev";
        char[] tStr = new char[fStr.Length];
        int count = -1, j;

        for (j = 0; j < tStr.Length; j++)
            tStr[j] = ' ';
        for (int i = 0; i < fStr.Length; i++)
        {
            for (j = 0; j < sStr.Length; j++)
                if (fStr[i] == sStr[j]) break;
            if (j == sStr.Length)
                tStr[++count] = fStr[i];
        }
string fStr=“bhardwaj”,sStr=“dev”;
char[]tStr=新字符[fStr.Length];
整数计数=-1,j;
对于(j=0;j
这里有无指针

事实上,有很多解决方案可以做到这一点

我试过的一个在这里

        string fStr = "bhardwaj", sStr = "dev";
        char[] tStr = new char[fStr.Length];
        int count = -1, j;

        for (j = 0; j < tStr.Length; j++)
            tStr[j] = ' ';
        for (int i = 0; i < fStr.Length; i++)
        {
            for (j = 0; j < sStr.Length; j++)
                if (fStr[i] == sStr[j]) break;
            if (j == sStr.Length)
                tStr[++count] = fStr[i];
        }
string fStr=“bhardwaj”,sStr=“dev”;
char[]tStr=新字符[fStr.Length];
整数计数=-1,j;
对于(j=0;j
在下面找到代码

#include <stdio.h>
#include <string.h>
int main ()
{
    char s1[20] = { 0 }, s2[ 20], r[20] = {0}, t[ 26] = { 0};
    int i=0,j=0;

    scanf ("%s",s1);
    scanf ("%s",s2);

    for (i=0; i<strlen (s2); ++i)
    {
        t[s2[i]-'a'] = 1;
    }

    for (i=0; i<strlen (s1); ++i)
    {
        if (!t[s1[i]-'a'])
        {
            r[j]=s1[i];
            j++;
        }
    }

    r[j]='\0';

    printf ("result:%s\n", r);
}
#包括
#包括
int main()
{
字符s1[20]={0},s2[20],r[20]={0},t[26]={0};
int i=0,j=0;
scanf(“%s”,s1);
scanf(“%s”,s2);
对于(i=0;i在下面找到代码

#include <stdio.h>
#include <string.h>
int main ()
{
    char s1[20] = { 0 }, s2[ 20], r[20] = {0}, t[ 26] = { 0};
    int i=0,j=0;

    scanf ("%s",s1);
    scanf ("%s",s2);

    for (i=0; i<strlen (s2); ++i)
    {
        t[s2[i]-'a'] = 1;
    }

    for (i=0; i<strlen (s1); ++i)
    {
        if (!t[s1[i]-'a'])
        {
            r[j]=s1[i];
            j++;
        }
    }

    r[j]='\0';

    printf ("result:%s\n", r);
}
#包括
#包括
int main()
{
字符s1[20]={0},s2[20],r[20]={0},t[26]={0};
int i=0,j=0;
scanf(“%s”,s1);
scanf(“%s”,s2);

对于(i=0;i你忘了问问题。当你按下标有“问问题”
的按钮时,你应该问一个问题。string1中的字母可以重复吗?@learner,我知道,只是在作业的第一部分从整个字符串中删除了一个字符,所以现在我面临这个问题,这就是我要问的必须使用。请参考此链接了解您的解决方案。算法应该是:a)创建新的空字符串b)迭代“string1”中的所有字符,c)添加到新字符串,除非它们出现在“字符串二”中。您忘记问问题。当您按下标有“问问题”
的按钮时,您应该问一个问题。字符串1中的字母可以重复吗?@learner,我知道,这只是作业的第一部分从整个字符串中删除了一个字符,现在我面临这个问题,这就是我必须解决的问题。请参考此链接以获得解决方案。算法应该是:a)创建新的空字符串b)迭代“string1”中的所有字符,并将其添加到新字符串中,除非它们出现在“string two”中。这看起来不像c:)它的c#,但两者的逻辑是相同的。不一样,我希望你教我如何
string.Length
c
中为该字符数组,1)循环每个元素,2)检查该元素是否为!='\0',3)每个I迭代增加一个变量。这看起来不像C:)它的C#,但两者的逻辑是相同的。不一样,我希望你教我如何
字符串。长度
C
中,对于该字符数组,1)循环每个元素,2)检查该元素是否!='\0',3)对于每个迭代增加一个变量。你没有完美地解决我的问题。但是你的代码让我想到在“rmstr”函数中调用我的“rmchr”函数,从而得到我想要的正确输出。非常感谢。你没有完全解决我的问题。但是你的代码让我想到在“rmstr”函数中调用我的“rmchr”函数,从而得到我想要的正确输出。非常感谢。