鱼C论坛

 找回密码
 立即注册
查看: 1611|回复: 2

[已解决]求助一道C++题目

[复制链接]
发表于 2020-2-17 11:13:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1579103680 于 2020-2-17 14:42 编辑

定义一个字符串类 CString,并设计一个算法实现,给定关键字 str1 在字符串 str 中出现时用关键字 str2 进行替换的功能。

具体要求如下:

(1)私有数据成员

char *str;   原始字符串。

char *str1;  目标关键字。

char *str2;  替换关键字。

int flag;标记替换是否完成替换。

(2)公有成员函数

CString (char *s,char s1[ ],char *s2) :用给定的参数s、s1 和s2 相对应的初始化数据成员str、str1 和str2。flag设置缺省 0。

void Replace () :判断str字符串中是否出现str1,若出现就用str2 替换,否则什么都不做。若替换成功了标记flag为 1,若替换不成功则标记flag为 0。

void Show( ) :若替换成功,则在屏幕上显示目标关键字、替换关键字和替换后的原始字符串;若不成功则显示原始字符串。

~ CString() :释放动态分配的空间。

(3)在主程序中定义字符串char s[]=”I am a student, you are student too, we are all student.” 作为原始字符串,定义char s1[]=” student”作为目标关键字,定义char s2[]=”teacher” 作为替换关键字。定义一个CString类对象test,用s,s1 和s2 初始化test,完成对该类的测试。
最佳答案
2020-2-17 17:44:05
  1. #include <iostream>
  2. #include <string.h>

  3. using namespace std;

  4. class CString
  5. {
  6. public:
  7.     CString(char *s, char s1[], char *s2);
  8.     void Replace();
  9.     void Show();
  10.     ~CString();
  11.    
  12. private:
  13.     char *str;
  14.     char *str1;
  15.     char *str2;
  16.     int flag;
  17. };


  18. CString::CString(char *s, char s1[], char *s2)
  19. {
  20.     str = new char[strlen(s) + 1];
  21.     str1 = new char[strlen(s1) + 1];
  22.     str2 = new char[strlen(s2) + 1];
  23.    
  24.     strcpy(str, s);
  25.     strcpy(str1, s1);
  26.     strcpy(str2, s2);
  27.    
  28.     flag = 0;
  29.    
  30. }

  31. void CString::Replace()
  32. {
  33.     char *temp1 = str1;
  34.     char *temp_str = str;
  35.     while (*temp_str!='\0')
  36.     {
  37.         while(*temp_str == *temp1)
  38.         {
  39.             temp_str++;
  40.             temp1++;
  41.             if(*temp1 == '\0')
  42.             {
  43.                 flag = 1;
  44.                
  45.                 char *r_str = new char[strlen(temp_str) + 1];
  46.                 strcpy(r_str, temp_str);        //取出要目标字符串后面的字符串
  47.                 char *l_str = temp_str-strlen(str1);    //指向目标字符串
  48.                 strcpy(l_str, str2);            //复制替换目标字符串
  49.                 strcat(l_str, r_str);           //拼接两段字符串
  50.                 temp_str = temp_str-strlen(str1)+strlen(str2)-1;  //temp_str指向替换了的字符串末尾
  51.                 delete[] r_str;
  52.             }
  53.         }
  54.         if(strlen(temp_str)<strlen(str1))
  55.             break;
  56.         temp_str++;
  57.         temp1 = str1;
  58.     }
  59. }

  60. void CString::Show()
  61. {
  62.     if(flag == 1)
  63.     {
  64.         cout << "目标关键字:" << str1 <<endl;
  65.         cout << "替换关键字:" << str2 << endl;
  66.         cout << "替换字符串:" << str << endl;
  67.     }
  68.     else
  69.     {
  70.         cout << "原始字符串:" << str << endl;
  71.     }
  72. }

  73. CString::~CString()
  74. {
  75.     if (str != NULL) {
  76.         delete[] str;
  77.         str = NULL;
  78.     }
  79.     if (str1 != NULL) {
  80.         delete[] str1;
  81.         str1 = NULL;
  82.     }
  83.     if (str2 != NULL) {
  84.         delete[] str2;
  85.         str2 = NULL;
  86.     }
  87. }

  88. int main(int argc, const char * argv[]) {
  89.    
  90.     char s[] = "I am a student, you are student too, we are all student.";
  91.     char s1[] = "student";
  92.     char s2[] = "teacher";
  93.    
  94.     CString test(s, s1, s2);
  95.    
  96.     test.Replace();
  97.     test.Show();
  98.    
  99.    
  100.     return 0;
  101. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-17 17:44:05 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>
  2. #include <string.h>

  3. using namespace std;

  4. class CString
  5. {
  6. public:
  7.     CString(char *s, char s1[], char *s2);
  8.     void Replace();
  9.     void Show();
  10.     ~CString();
  11.    
  12. private:
  13.     char *str;
  14.     char *str1;
  15.     char *str2;
  16.     int flag;
  17. };


  18. CString::CString(char *s, char s1[], char *s2)
  19. {
  20.     str = new char[strlen(s) + 1];
  21.     str1 = new char[strlen(s1) + 1];
  22.     str2 = new char[strlen(s2) + 1];
  23.    
  24.     strcpy(str, s);
  25.     strcpy(str1, s1);
  26.     strcpy(str2, s2);
  27.    
  28.     flag = 0;
  29.    
  30. }

  31. void CString::Replace()
  32. {
  33.     char *temp1 = str1;
  34.     char *temp_str = str;
  35.     while (*temp_str!='\0')
  36.     {
  37.         while(*temp_str == *temp1)
  38.         {
  39.             temp_str++;
  40.             temp1++;
  41.             if(*temp1 == '\0')
  42.             {
  43.                 flag = 1;
  44.                
  45.                 char *r_str = new char[strlen(temp_str) + 1];
  46.                 strcpy(r_str, temp_str);        //取出要目标字符串后面的字符串
  47.                 char *l_str = temp_str-strlen(str1);    //指向目标字符串
  48.                 strcpy(l_str, str2);            //复制替换目标字符串
  49.                 strcat(l_str, r_str);           //拼接两段字符串
  50.                 temp_str = temp_str-strlen(str1)+strlen(str2)-1;  //temp_str指向替换了的字符串末尾
  51.                 delete[] r_str;
  52.             }
  53.         }
  54.         if(strlen(temp_str)<strlen(str1))
  55.             break;
  56.         temp_str++;
  57.         temp1 = str1;
  58.     }
  59. }

  60. void CString::Show()
  61. {
  62.     if(flag == 1)
  63.     {
  64.         cout << "目标关键字:" << str1 <<endl;
  65.         cout << "替换关键字:" << str2 << endl;
  66.         cout << "替换字符串:" << str << endl;
  67.     }
  68.     else
  69.     {
  70.         cout << "原始字符串:" << str << endl;
  71.     }
  72. }

  73. CString::~CString()
  74. {
  75.     if (str != NULL) {
  76.         delete[] str;
  77.         str = NULL;
  78.     }
  79.     if (str1 != NULL) {
  80.         delete[] str1;
  81.         str1 = NULL;
  82.     }
  83.     if (str2 != NULL) {
  84.         delete[] str2;
  85.         str2 = NULL;
  86.     }
  87. }

  88. int main(int argc, const char * argv[]) {
  89.    
  90.     char s[] = "I am a student, you are student too, we are all student.";
  91.     char s1[] = "student";
  92.     char s2[] = "teacher";
  93.    
  94.     CString test(s, s1, s2);
  95.    
  96.     test.Replace();
  97.     test.Show();
  98.    
  99.    
  100.     return 0;
  101. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-17 18:19:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 16:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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