鱼C论坛

 找回密码
 立即注册
查看: 3999|回复: 9

[已解决]一道简单的利用指针的题目

[复制链接]
发表于 2021-5-31 13:38:03 From FishC Mobile | 显示全部楼层 |阅读模式
25鱼币
问题描述
  编写程序,输入两个字符串,从第一个字符串中删除第二个字符串,输出删除后的字符串。例如输入”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[100],ch2[100],*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';
}
在此提前感谢大佬
最佳答案
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;
}

自写不易

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}

自写不易
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 15:43:08 From FishC Mobile | 显示全部楼层
万千只cnm 发表于 2021-5-31 14:40
自写不易

temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 16:09:47 | 显示全部楼层
魔轩 发表于 2021-5-31 15:43
temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)
 *temp++ = *string++; //复制完成
temp和 string 都向后指了
回不去了  
相当于用index保存 temp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 16:56:24 From FishC Mobile | 显示全部楼层
万千只cnm 发表于 2021-5-31 16:09
temp和 string 都向后指了
回不去了  
相当于用index保存 temp

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 17:00:11 | 显示全部楼层

来个最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 17:38:45 From FishC Mobile | 显示全部楼层
万千只cnm 发表于 2021-5-31 17:00
来个最佳

给了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 18:04:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 22:36:20 | 显示全部楼层

你试试输入是abdefabcefgabcdef和abcd,这个貌似不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 17:00:54 | 显示全部楼层
魔轩 发表于 2021-5-31 22:36
你试试输入是abdefabcefgabcdef和abcd,这个貌似不行
else return 0;
哦哦 这里返回0退出了  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 12:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表