鱼C论坛

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

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

[复制链接]
发表于 2021-5-31 13:38:03 From FishC Mobile | 显示全部楼层 |阅读模式
25鱼币
问题描述
  编写程序,输入两个字符串,从第一个字符串中删除第二个字符串,输出删除后的字符串。例如输入”abcabcd”和”bc”,则输出”aad”。用指针实现。
输入格式
  输入两个字符串ch1和ch2
输出格式
  输出删除ch2后的字符串ch1
样例输入
一个满足题目要求的输入范例。
例:
abcabcd

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


这是我代码大概错误原因已经知道,希望大佬能帮忙改正并指出错误,或者大佬们重新写一个思路(最好能加上注释)
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         void del(char *q,char *qq);
  6.         char ch1[100],ch2[100],*p,*pp;
  7.         gets(ch1);
  8.         gets(ch2);
  9.         p=ch1;
  10.         pp=ch2;
  11.         del(p,pp);
  12.         puts(ch1);
  13.         return 0;
  14. }
  15. void del(char *q,char *qq)
  16. {
  17.         char *s;
  18.         for(s=q;*s!='\0';s++)
  19.         {
  20.                 if(*s!=*qq)
  21.                 *q++=*s;
  22.         }
  23.         *q='\0';
  24. }
复制代码

在此提前感谢大佬
最佳答案
2021-5-31 13:38:04
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUL 0  // '\0' == 0
  4. int del_substr(char *string,char const *dele_str)
  5. {
  6.            char *temp;
  7.            char *index;
  8.            char  *dele_head=dele_str; // 保存要删除的数据的头指针
  9.       while( *string != NUL){
  10.                  if( *string== *dele_str){
  11.                               temp=index=string;//第一次相同时的字符   
  12.                               // 用于定位   temp复制时会丢失   所以index 用于第二次遍历
  13.                                 
  14.                                 while( *dele_str != NUL && *dele_str++ == *string++)
  15.                                            //  只能 dele的数据到结尾了  或   元素不相等了
  16.                                                      ;
  17.                                                    
  18.                                                    
  19.                                          if( *dele_str == NUL){// 如果到结尾了 且保持一直相等
  20.                                                    while( *string != NUL) //剩余的字符
  21.                                                      *temp++ = *string++; //复制完成
  22.                                                                  }
  23.                                                         else return 0; //如果else  -->   说明不相等 返回 0
  24.                                                           *temp= NUL;//添加 ‘|0’
  25.                                                           //   
  26.                                          string = --index; // 将目标字符串 头指针定位到删除复制完成后 的第一个位置   继续遍历
  27.                                          // -1 因为下面string++了
  28.                                          dele_str = dele_head;//要删除的字符串 头指针复原  
  29.                                                                   
  30.                          }
  31.                
  32.               string++;
  33.           }
  34.           return 1; //成功返回1 失败 0
  35. }
  36. int main()
  37. {
  38.     char str[]="CDCD66CD6999 ",*substr="CD";
  39.     int res=del_substr(str,substr);
  40.     printf("%d\n%s\n",res,str);
  41.     return 0;
  42. }
复制代码


自写不易

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 13:38:04 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUL 0  // '\0' == 0
  4. int del_substr(char *string,char const *dele_str)
  5. {
  6.            char *temp;
  7.            char *index;
  8.            char  *dele_head=dele_str; // 保存要删除的数据的头指针
  9.       while( *string != NUL){
  10.                  if( *string== *dele_str){
  11.                               temp=index=string;//第一次相同时的字符   
  12.                               // 用于定位   temp复制时会丢失   所以index 用于第二次遍历
  13.                                 
  14.                                 while( *dele_str != NUL && *dele_str++ == *string++)
  15.                                            //  只能 dele的数据到结尾了  或   元素不相等了
  16.                                                      ;
  17.                                                    
  18.                                                    
  19.                                          if( *dele_str == NUL){// 如果到结尾了 且保持一直相等
  20.                                                    while( *string != NUL) //剩余的字符
  21.                                                      *temp++ = *string++; //复制完成
  22.                                                                  }
  23.                                                         else return 0; //如果else  -->   说明不相等 返回 0
  24.                                                           *temp= NUL;//添加 ‘|0’
  25.                                                           //   
  26.                                          string = --index; // 将目标字符串 头指针定位到删除复制完成后 的第一个位置   继续遍历
  27.                                          // -1 因为下面string++了
  28.                                          dele_str = dele_head;//要删除的字符串 头指针复原  
  29.                                                                   
  30.                          }
  31.                
  32.               string++;
  33.           }
  34.           return 1; //成功返回1 失败 0
  35. }
  36. int main()
  37. {
  38.     char str[]="CDCD66CD6999 ",*substr="CD";
  39.     int res=del_substr(str,substr);
  40.     printf("%d\n%s\n",res,str);
  41.     return 0;
  42. }
复制代码


自写不易
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 16:09:47 | 显示全部楼层
魔轩 发表于 2021-5-31 15:43
temp复制时会丢失   所以index 用于第二次遍历
为啥会丢失?(我真的挺菜的)
  1. *temp++ = *string++; //复制完成
复制代码

temp和 string 都向后指了
回不去了  
相当于用index保存 temp
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

来个最佳
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

给了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-31 18:04:36 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

你试试输入是abdefabcefgabcdef和abcd,这个貌似不行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 17:00:54 | 显示全部楼层
魔轩 发表于 2021-5-31 22:36
你试试输入是abdefabcefgabcdef和abcd,这个貌似不行
  1. else return 0;
复制代码

哦哦 这里返回0退出了  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 06:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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