C练习删除s1中s2中的所有字符

C练习删除s1中s2中的所有字符,c,for-loop,c-strings,function-definition,remove,C,For Loop,C Strings,Function Definition,Remove,练习: 删除s1中s2中的所有字母: 我的代码是: 我不明白怎么了,有人能帮我吗 #include <stdio.h> #include <stdlib.h> void squeeze(char s1[], char s2[]) { int i,j; i=j=0; for(i; s2[i]!='\0'; i++) { for (j; s1[j] != '\0'; j++) { if (s1[j] ==

练习: 删除s1中s2中的所有字母: 我的代码是: 我不明白怎么了,有人能帮我吗

#include <stdio.h>
#include <stdlib.h>

void squeeze(char s1[], char s2[])
{
    int i,j;
    i=j=0;


    for(i; s2[i]!='\0'; i++) {
        for (j; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]) {
                s1[j] = s1[j + 1];
                --j;
            }


        }
    }
}

int main()
{
    char w1[] = "abcde";
    char w2[] = "fghaj";
    squeeze(w1,w2);
    puts(w1);
    return 0;

}
#包括
#包括
空隙挤压(字符s1[],字符s2[]
{
int i,j;
i=j=0;
对于(i;s2[i]!='\0';i++){
对于(j;s1[j]!='\0';j++){
if(s1[j]==s2[i]){
s1[j]=s1[j+1];
--j;
}
}
}
}
int main()
{
字符w1[]=“abcde”;
字符w2[]=“fghaj”;
挤压(w1,w2);
puts(w1);
返回0;
}
但结果是: abcde


我应该修复什么?

挤压中的两个问题:

  • 每次通过循环时,需要将
    j
    重新初始化为零
  • 您需要将字符串的整个剩余部分向左复制一个字符,而不仅仅是要删除的字符后面的字符
  • 我建议您将
    压缩
    改写为:

    void squeeze(char s1[], char s2[])
    {
        int i,j;
        i=j=0;
    
        for( ; s2[i]!='\0'; i++) {
            for (j = 0; s1[j] != '\0'; j++) {
                if (s1[j] == s2[i]) {
                  strcpy(s1+j, s1+j+1);
                  --j;
                }
            }
        }
    }
    

    首先,对于外循环的每次迭代,内循环中的变量
    j
    不会重置为
    0

    第二,如果必须删除某个字符,则该字符之后的所有字符都不会移动到左一个位置。您只需将删除的字符替换为字符串中的下一个字符

    该函数可以如下所示,如下面的演示程序所示

    #include <stdio.h>
    #include <string.h>
    
    char * squeeze( char s1[], const char s2[] )
    {
        for ( char *p = s1, *q = s1; *q; ++p )
        {
            if ( !*p || !strchr( s2, *p ) )
            {
                if ( q != p )
                {
                    *q = *p;
                }
                if ( *p ) ++q;
            }
        }
        
        return s1;
    }
    
    int main( void )
    {
        char w1[] = "abcde";
        char w2[] = "fghaj";
        
        puts( squeeze( w1, w2 ) );
    
        return 0;
    } 
    
    如果不允许使用标准字符串函数和指针,那么程序可以按以下方式运行

    #include <stdio.h>
    
    char * squeeze( char s1[], const char s2[] )
    {
        for ( size_t i = 0, j = 0; s1[j] != '\0'; ++i )
        {
            size_t k = 0;
            
            while ( s2[k] != '\0' && s2[k] != s1[i] ) ++k;
            
            if ( s2[k] == '\0' )
            {
                if ( j != i )
                {
                    s1[j] = s1[i];
                }
                if ( s1[i] != '\0' ) ++j;
            }
        }
        
        return s1;
    }
    
    int main( void )
    {
        char w1[] = "abcde";
        char w2[] = "fghaj";
        
        puts( squeeze( w1, w2 ) );
    
        return 0;
    }
    

    我在这里看到一个问题,由于某些原因,您的代码没有输入此语句:

     if (s1[j] == s2[i]) {
                s1[j] = s1[j + 1];
                --j;
            }
    
    你的问题可能是为什么?因为i和j未设置为0,请尝试打印它们,您将看到j将移动到4,但我将永远保持为0 因此,作为一个开始,你可以通过这样做来修复它

    for(i=0; s2[i]!='\0'; i++) {
    for (j=0; s1[j] != '\0'; j++) {
    
    然后,您没有复制整个字符串并将其向后移动一步以重写找到的字符,您只移动了一个字符并将其留空 例

    要解决此问题,有两种方法: 使用
    strcpy
    将代码向后移动一步

    for(i=0; s2[i]!='\0'; i++) {
        for (j=0; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]){
                strcpy(s1+j, s1+j+1);
                --j;
            }
    
    
        }
    
    或者,您可以简单地使用一个用于

    for(i=0; s2[i]!='\0'; i++) {
        for (j=0; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]){
                for (k=j;s1[k] != '\0';k++)
                s1[k] = s1[k + 1];
                --j;
            }
    
    
        }
    

    您是否已尝试在调试器中逐个语句地遍历代码语句?它告诉你什么?我是一个初学者,所以它告诉我什么,而且我从来没有使用过调试器,然后把这当作学习如何使用调试器的最佳时机。如果你想做任何类型的编程,能够使用调试器是必须的。谢谢,我会看到itokay谢谢,但是没有“strcpt”怎么做?写另一个循环来做strcpy所做的事情。我试着:void-squence(char-s1[],char-s2[]){int-i,j,k;for(i=0;s2[i]!='\0';i++{for(j=0;s1 j]!='\0';j++){if(s1[j]==s2[i]){for(k=j;k!='\0';k++){s1[k]=s1[k+1];}}}}但它仍然没有work@BobJarvis-恢复Monica使用strcpy提供的代码具有未定义的行为。谢谢,但我必须在没有指针的情况下执行此操作/indicators@HGH指标是什么?我是说'*“只是不知道用英语怎么说,指针?index?@HGH查看我的更新答案。谢谢,但是没有“strcpy”怎么办?我知道我应该使用第三个循环,但我不知道如何…@HGH我不确定你是否看到最后一部分,尝试刷新页面,因为我已经写了如何使用相同的strcpy函数使用for boucleyeah,页面没有刷新,现在我可以看到了,非常感谢!我是如此接近。。。我讨厌C…@HGH我很高兴我能帮助你。不要放弃,试着用更多的例子来实现你的解决方案
    input : abcde
    output :b_cde
    
    for(i=0; s2[i]!='\0'; i++) {
        for (j=0; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]){
                strcpy(s1+j, s1+j+1);
                --j;
            }
    
    
        }
    
    for(i=0; s2[i]!='\0'; i++) {
        for (j=0; s1[j] != '\0'; j++) {
            if (s1[j] == s2[i]){
                for (k=j;s1[k] != '\0';k++)
                s1[k] = s1[k + 1];
                --j;
            }
    
    
        }
    
         #include <stdio.h>
         #include <string.h>
    
         int rem_str(char * porgstr, char * pdel) {
             if (!porgstr || !pdel) {
                 return 0;
             }
             int i = 0;
             int j = 0;    
             char tmp[256] = {0};
             int len = strlen(pdel);
             for (i = 0; i < len; i++) {
                tmp[pdel[i]]++;
             }
             len = strlen(porgstr);
             for (i = 0, j=0; i < len; i++) {
                if(tmp[porgstr[i]] == 0) {
                    porgstr[j] = porgstr[i];
                    j++;
                }
             }
             porgstr[j] = 0;
             return 0;
         }
         int main () {
             char * input1 = strdup("origional string passed to program");
             char * input2 = strdup("sdel");
    
             printf("Input before del : %s\n", input1);
             rem_str(input1, input2);
             printf("String after del : %s\n", input1);
    
             return 0;
         }
    
          ./a.out 
         Input before del : origional string passed to program
         string after del : origiona tring pa to program