魔轩 发表于 2021-5-31 13:38:03

一道简单的利用指针的题目

问题描述
  编写程序,输入两个字符串,从第一个字符串中删除第二个字符串,输出删除后的字符串。例如输入”abcabcd”和”bc”,则输出”aad”。用指针实现。
输入格式
  输入两个字符串ch1和ch2
输出格式
  输出删除ch2后的字符串ch1
样例输入
一个满足题目要求的输入范例。
例:
abcabcd

bc
样例输出
与上面的样例输入对应的输出。
例:
aad
数据规模和约定
  输入数据中每一个数的范围。
  输入的字符串长度小于100


这是我代码大概错误原因已经知道,希望大佬能帮忙改正并指出错误,或者大佬们重新写一个思路(最好能加上注释)
#include<stdio.h>
#include<string.h>
int main()
{
        void del(char *q,char *qq);
        char ch1,ch2,*p,*pp;
        gets(ch1);
        gets(ch2);
        p=ch1;
        pp=ch2;
        del(p,pp);
        puts(ch1);
        return 0;
}
void del(char *q,char *qq)
{
        char *s;
        for(s=q;*s!='\0';s++)
        {
                if(*s!=*qq)
                *q++=*s;
        }
        *q='\0';
}
在此提前感谢大佬

万千只cnm 发表于 2021-5-31 13:38:04

#include <stdio.h>
#include <stdlib.h>
#define NUL 0// '\0' == 0
int del_substr(char *string,char const *dele_str)
{
           char *temp;
           char *index;
           char*dele_head=dele_str; // 保存要删除的数据的头指针
      while( *string != NUL){
                 if( *string== *dele_str){
                              temp=index=string;//第一次相同时的字符   
                              // 用于定位   temp复制时会丢失   所以index 用于第二次遍历
                              
                              while( *dele_str != NUL && *dele_str++ == *string++)
                                           //只能 dele的数据到结尾了或   元素不相等了
                                                   ;
                                                   
                                                   
                                       if( *dele_str == NUL){// 如果到结尾了 且保持一直相等
                                                 while( *string != NUL) //剩余的字符
                                                 *temp++ = *string++; //复制完成
                                                               }
                                                        else return 0; //如果else-->   说明不相等 返回 0
                                                          *temp= NUL;//添加 ‘|0’
                                                          //   
                                       string = --index; // 将目标字符串 头指针定位到删除复制完成后 的第一个位置   继续遍历
                                       // -1 因为下面string++了
                                       dele_str = dele_head;//要删除的字符串 头指针复原
                                                                
                       }
             
              string++;
          }
          return 1; //成功返回1 失败 0
}
int main()
{
    char str[]="CDCD66CD6999 ",*substr="CD";
    int res=del_substr(str,substr);
    printf("%d\n%s\n",res,str);
    return 0;
}


自写不易{:5_104:}

魔轩 发表于 2021-5-31 15:43:08

万千只cnm 发表于 2021-5-31 14:40
自写不易

temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)

万千只cnm 发表于 2021-5-31 16:09:47

魔轩 发表于 2021-5-31 15:43
temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)

*temp++ = *string++; //复制完成
temp和 string 都向后指了
回不去了
相当于用index保存 temp

魔轩 发表于 2021-5-31 16:56:24

万千只cnm 发表于 2021-5-31 16:09
temp和 string 都向后指了
回不去了
相当于用index保存 temp

谢谢

万千只cnm 发表于 2021-5-31 17:00:11

魔轩 发表于 2021-5-31 16:56
谢谢

来个最佳{:5_102:}

魔轩 发表于 2021-5-31 17:38:45

万千只cnm 发表于 2021-5-31 17:00
来个最佳

给了{:10_256:}

万千只cnm 发表于 2021-5-31 18:04:36

魔轩 发表于 2021-5-31 17:38
给了

{:5_109:}

魔轩 发表于 2021-5-31 22:36:20

万千只cnm 发表于 2021-5-31 18:04


你试试输入是abdefabcefgabcdef和abcd,这个貌似不行

万千只cnm 发表于 2021-6-1 17:00:54

魔轩 发表于 2021-5-31 22:36
你试试输入是abdefabcefgabcdef和abcd,这个貌似不行

else return 0;
哦哦 这里返回0退出了
页: [1]
查看完整版本: 一道简单的利用指针的题目