登录

c++ - 看不懂这段c语言代码的思路,目的是删除字符串1中与字符串2相同的字符

代码:

char *eliminate(char str1[], char str2[])
{
int i, j, k;
   for(i=j=0;str1[i];i++)
   {
for(k=0;str2[k] && str1[i]!=str2[k];k++); if(str2[k]== ‘\0’)
         str1[j++]=str1[i];
   }
str1[j]=‘\0’;
   return str1;
}

感觉根本就没给j赋值啊,也不知道str1[j++]=str1[i]是想做什么。。。求助大神

原问题:

• Write a program to read two strings as input and remove from string
1 all characters contained in string 2
• Example:

  • str1: “Olimpico”

  • str2: “Oio”

  • result: “lmpc”

答案全部代码

#include < stdio.h > 
#define MAXCAR 128
char * eliminate(char str1[], char b[]);
int main() {
    char str1[MAXCAR], str2[MAXCAR];
    printf(“Give me a string str1: ”);
    scanf(“ % s”, str1);
    printf(“Give me a string str2: ”);
    scanf(“ % s”, str2);
    printf(“str1 - str2 = % s\ n”, eliminate(str1, str2));
    return 0;
}

char * eliminate(char str1[], char str2[]) {
    int i, j, k;
    for (i = j = 0; str1[i]; i++) {
        for (k = 0; str2[k] && str1[i] != str2[k]; k++);
        if (str2[k] == ‘\0’)
            str1[j++] = str1[i];
    }
    str1[j] = ‘\0’;
    return str1;
}
# C++
PHPzhongPHPzhong2154 天前459 次浏览

全部回复(2) 我要回复

  • 大家讲道理

    大家讲道理2017-04-17 13:08:30

    感觉根本就没给j赋值啊

    for(i=j=0;str1[i];i++)

    也不知道str1[j++]=str1[i]是想做什么。。。求助大神

    其实很简单,代码的思路就是一个字节一个字节的处理str1,i是正在读取的位置,j是正在写入的位置。如果i目前的字符在str2中存在了,那么j就可以覆盖他,因此不用++。所以只需要在写的时候才j++,度的时候i总是++,这就是这句代码的意思。

    举个例子

    str1 = abcbd
    str2 = b
    
    step 1. [i][j]abcbd\0
    step 2. a[i][j]bcbd\0
    step 3. a[j]b[i]cbd\0
    step 4. ac[j]c[i]bd\0
    step 5. ac[j]cb[i]d\0
    step 6. acd[j]bd[i]\0
    step 7. acd\0[j]d\0[i]
    

    到此就结束了。虽然str1里面的字符串是acd\0d\0,不过因为C语言默认\0就是字符串的结尾,所以后面的d\0就会被忽略。

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 13:08:30

    你的代码我试了下运行不了,应该是一些中英文字符搞混了吧
    我帮你改了代码,并且运行过了
    思路都写在注释里了
    你的ID。。。

    #include <stdio.h> 
    #define MAXCAR 128
    char *eliminate(char str1[], char b[]);
    int main() {
        char str1[MAXCAR], str2[MAXCAR];
        printf("Give me a string str1: ");
        scanf("%s", str1);
        printf("Give me a string str2: ");
        scanf("%s", str2);
        printf("str1 - str2 =%s\n", eliminate(str1, str2));
        return 0;
    }
    
    char *eliminate(char str1[], char str2[]) {
        int i, j, k;
        for (i = j = 0; str1[i]; i++) {
            for (k = 0; str2[k] && str1[i] != str2[k]; k++);//这句代码为了找出str1[i]==str2[k]
            if(str2[k] == '\0')//如果在str2中发现有与str1中相同的,但是却是'\0',那就代表其实str2中没有与str1中相同的字符
                str1[j++] = str1[i];//那么j就可以写入
            //else 出现了相同的就舍弃,j不写入
        }
        str1[j] = '\0';//所有str1中的字符都检查过了,就添加一个'\0'收尾
        return str1;
    }

    回复
    0
  • 取消回复发送