首页 > 解决方案 > 如何从一个字符串中删除另一个字符串中的所有字符?

问题描述

我需要删除所有来自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;
}

但输出是:

abcde

我应该修理什么?

标签: cstringc-strings

解决方案


对于初学者,对于外循环的每次迭代,变量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;
} 

程序输出为

bcde

如果您不允许使用标准字符串函数和指针,那么程序可以如下所示。

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

程序输出与前面的演示程序相同

bcde

推荐阅读