鱼C论坛

 找回密码
 立即注册
查看: 2873|回复: 3

[技术交流] 字符更换

[复制链接]
发表于 2022-10-15 10:25:46 | 显示全部楼层 |阅读模式

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

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

x
前段时间,看到坛里有说指定字串中的字符改字母的,今天写了一个,大家看看符合了要求没有.



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

使用道具 举报

 楼主| 发表于 2022-10-15 10:34:36 | 显示全部楼层
这是所有的方法,定义了生成对像的总数统计,深复制 和 赋值重载.
另外,把每个对像的总统计数的当前数,复制一份到自己,做成链表的话,应当非常方便.
#ifndef MYSTRING_H
#define MYSTRING_H

class mystring
{
        static int sum;
        char *p;
        int plen,n;
        public:
                mystring();
                ~mystring();
                mystring(const char*);
                mystring(const mystring&);
                void operator=(const mystring&);
                
                void disp();
                void rename(const char*);
                void rename(int index,char b);
        protected:
};

#endif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 10:39:13 | 显示全部楼层
这是实现,使用了cstring中的方法: strlen,strcpy两个,来免除一次次对char数组的遍历,
只要把对char数组的下标控制到不越界,即可.考虑到如果在游戏系统中对初始化玩家姓名,生平,等等,对字符串的要求,暂时只做到这样应该能正常的工作吧?
欢迎大家补充.

#include "mystring.h"
#include <cstring>
#include <stdio.h>
int mystring:: sum=0;
mystring::mystring():plen(7)
{
        p=new char[plen];
        strcpy(p,"deault");
        sum++;
        n=sum;
}

mystring::~mystring()
{
        printf("string %d %p "%s" was deleted (destroy)\n",n,p,p);
        sum--;
        delete [] p;
}

mystring :: mystring(const char* a)
{
        plen = strlen(a)+1;
        p= new char [ plen ];
        strcpy(p,a);
        sum++;
        n=sum;
}

mystring :: mystring(const mystring&a)
{
        delete []p;
        plen= a.plen;
        p=new char [ plen ];
        strcpy(p,a.p);
        sum++;
        n=sum;
}

void mystring::operator=(const mystring&a)
{
        delete []p;
        plen= a.plen;
        p=new char [ plen ];
        strcpy(p,a.p);
}

void mystring::disp()
{
        printf("string %d %p %s (disp)\n",n,p,p);
}

void mystring:: rename(const char*a)
{
        delete [] p;
        plen = strlen(a) + 1;
        p=new char[plen];
        strcpy(p,a);
}

void mystring:: rename(int index,char b)
{
        if(index<0)
        {
                printf("string %d min length is 0 "%c" can not replace "%c"\n",
                                n,b,p[0]);
        }
        if(index<plen)
        {
                char t=p[index];
                p[index] = b;
                printf("string %d %p "%c" was replaced to "%c"\n",n,p,t,b);
        }
        else if(index==plen)
        {
                printf("string %d rear is space "%c" can not replace "%c"\n",
                                                n,b,p[plen]);
        }
        else
        {
                printf("string %d max length is %d can not use "%c" to replace\n",
                                                                n,plen,b);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 11:10:41 | 显示全部楼层
本帖最后由 howzyao 于 2022-10-15 11:11 编辑

大家对比一下,这两个功效一样,但少了点返回,是返回的好呢,还是直接在调用者的this中改了不返回好呢?

个人偏向到不返回,本质上,调用者总归是改好了嘛,何必返回.
mystring& operator=(const mystring&);
                //void operator=(const mystring&);
mystring& mystring:: operator=(const mystring&a)
{
        delete []p;
        plen= a.plen;
        p=new char [ plen ];
        strcpy(p,a.p);
        return *this;
}

//void mystring::operator=(const mystring&a)
//{
//        delete []p;
//        plen= a.plen;
//        p=new char [ plen ];
//        strcpy(p,a.p);
//}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 12:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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