回 帖 发 新 帖 刷新版面

主题:[讨论]C++ 一个模仿String的程序

本人新手,突然头脑发热想要写一个模仿String的程序,写完后运行发现使用Right()和Left()时程序会崩溃...可能是对指针掌握的不是很好,请大家看看,哪里出错了.新手学了两周第一次写这类程序,还请各位不要拍砖....

#include <iostream>
#include <string.h>
using namespace std;
//----------------------------------------
class CMyString
{
private:
    char chMain[100];
    char chRight[100];
    char chLeft[100];
public:
    int iCharConut;
    void operator=(const char* chMains)
    {
        this->iCharConut=0;
        strcpy(chMain,chMains);
        this->iCharConut=strlen(chMains);
    }
    char* Right(int n)
    {
        for(int a=iCharConut-n;a<iCharConut;a++)
            chRight[a]=chMain[a];
        char*re_chRight=NULL;
        for(int q=0;q<n;q++)
            *re_chRight+=chRight[q];
        return (char*)re_chRight;
    }
    char* Left(int n)
    {
        for(int s=0;s>n;s++)
            chLeft[s]=chMain[s];
        char*re_chLeft=NULL;
        for(int p=0;p<n;p++)
            *re_chLeft+=chRight[p];
        return (char*)re_chLeft;
    }
};
//------------------------------------------------
void main()
{
    CMyString strTest;
    strTest="abc";
    cout<<strTest.Right(2);
}

回复列表 (共7个回复)

沙发

*re_chRight+=chRight[q];
这一句里有两个问题:第一,你的re_chRight还没有分配内存就用了(注意NULL指针本身不能写,也不能取值)。第二,你只为本类型重载了=,这里却用了+,char的+是纯粹的数值加法,可不是字符串连接

板凳

这个问题其实并不简单。

3 楼

[quote]*re_chRight+=chRight[q];
这一句里有两个问题:第一,你的re_chRight还没有分配内存就用了(注意NULL指针本身不能写,也不能取值)。第二,你只为本类型重载了=,这里却用了+,char的+是纯粹的数值加法,可不是字符串连接[/quote]

哈?看来VB用多了没有注意这点...回去再试试..

顺便回楼上...呵呵,我当然知道不容易了,想试来玩玩罢..顺便锻炼一下嘿嘿

4 楼

string重要的理念是可变长字符串,你这个类可没看到

5 楼

..只是觉得String的Right() Left()取字符串很方便,想自己实现来看看罢了。可没想到完整拷贝[em1]

6 楼

其实最简单地,你只要在Left里return chLeft就可以了
而且,我认为你没必要给chLeft和chRight开成本类私有属性,这样做只是加大了开销
简单的做法是在Right和Left这两个方法里直接开char temp[100],然后用temp取子串,最后return temp就好了

7 楼


加个构造函数吧
CMyString() {
  memset(chMain, 0, sizeof(chMain));
  memset(chRight, 0, sizeof(chRight));
  memset(chLeft, 0, sizeof(chLeft));
  iCharConut = 0;
}
修改下这个
char* Right(int n)
{
    if (n >= iCharConut) {
        return NULL;
    }
        
    return &chMain[iCharConut - n];
}

这个楼主完成写错了
char* Left(int n)
 {
   for(int s=0;s<n;s++)
     chLeft[s]=chMain[s];
   chLeft[s] = '\0';
   return chLeft;
}

通过测试了的
欢迎加入12799663群。大家探讨问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册