面试常常用到string类的实现,自己总结了一下:

  

#pragma once

#include <iostream>
#include <cassert>
#include <iomanip>
using namespace std; class string{ friend ostream& operator <<(ostream&,string&);
friend istream& operator >>(istream&,string&); public:
string(const char* str = NULL);
//assignment constructor
string(const string& str);
~string(){
delete [] m_data;
} //get the length of string
int size(){
return mystrlen(m_data);
}
//return substring 这里存在一些问题待改善
//当字符串的长度稍大一些时会出错;
string substr(int pos);
string substr(int pos,int len);
//overload operator =
string& operator =(const string& other);
//overload operator +
string operator +(const string& other)const;
//overload operator +=
string& operator +=(const string& other);
//overload operator ==
bool operator ==(const string& other)const;
//overload operator []
char& operator [](unsigned int); private:
char* m_data;
};

cpp

#include "string.h"

string::string(const char* str /* = NULL */)
{
if (!str)
{
m_data = new char[];
*m_data = '\0';
}
else
{
int nLen = strlen(str);
m_data = new char[nLen + ];
strcpy(m_data,str);
}
} string::string(const string& str)
{ m_data = new char[strlen(str.m_data)+];
strcpy(m_data,str.m_data);
} ostream& operator <<(ostream& oscout,string& str)
{
oscout<<str.m_data;
return oscout;
} istream& operator >>(istream& iscin,string& str)
{
char temp[];
iscin>>setw()>>temp;
str = temp;
return iscin;
} string string::substr(int pos)
{
/*
int nLen = strlen(m_data);
char* res = new char(nLen - pos +1);
char* src = m_data + pos;
strncpy(res,src,nLen-pos);
string strres(res);
return strres;
*/ int nLen = strlen(m_data);
if (nLen < pos)
{
pos = nLen;
}
int nCopyLen = nLen - pos;
char* res = new char(nLen - pos +);
char* dest = res;
char* src = m_data + pos; for (int i = ;i < nCopyLen; i++)
{
*dest++ = *src++;
} *dest = '\0';
string strres(res);
return strres;
} string string::substr(int pos,int len)
{
int maxlen = strlen(m_data)-pos;
if (maxlen < ) maxlen = ;
int newLen = maxlen < len ? maxlen : len;
char* res = new char(newLen+);
char* src = m_data + pos;
strncpy(res,src,newLen);
*(res+newLen) = '\0';
string strres(res);
return strres;
} string string::operator +(const string& other)const
{
string newString;
if(!other.m_data)
newString = *this;
else if(!m_data)
newString = other;
else
{
newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+];
strcpy(newString.m_data,m_data);
strcat(newString.m_data,other.m_data);
}
return newString;
} string& string::operator =(const string& other)
{
if (this==&other)
return *this; delete [] m_data; m_data = new char[strlen(other.m_data)+];
strcpy(m_data,other.m_data); return *this;
} string& string::operator +=(const string& other)
{ char* data = new char[strlen(m_data)+strlen(other.m_data)+];
strcpy(data,m_data);
delete [] m_data;
m_data = data;
strcat(m_data,other.m_data); return *this;
} //overload operator ==
bool string::operator ==(const string& other)const
{
if ( strlen(other.m_data) != strlen(m_data) )
return false;
return strcmp(m_data,other.m_data)?false:true;
}
//overload operator []
char& string::operator [](unsigned int index)
{
if (index >= && index <= strlen(m_data))
return m_data[index]; return m_data[strlen(m_data)+];
}

另外转置输出string例子

#include <iostream>
#include <string>
using namespace std; //只限英文字符
void ReverseString(string& str)
{
int nLen = str.size(); for (int i = ; i < nLen/; i++)
{
char cTmp = str[nLen-i-];
str[nLen-i-] = str[i];
str[i] = cTmp;
}
}
//中英字符
void ReverseString1(string& str)
{
int nLen = str.size(); string strTmp;
strTmp.resize(nLen,' '); for (int i =; i < nLen; i++)
{
if ( str[i] < && str[i] > )
{
strTmp[nLen-i-] = str[i];
}
else
{
strTmp[nLen-i-] = str[i];
strTmp[nLen-i-] = str[i+];
++i;
}
}
str = strTmp;
} int main(int argc, char* argv[])
{
int nflag = ; while (nflag)
{
cout<<"enter a string including both lowercase and upercase letters!"<<endl;
string str;
cin.clear();
cin.sync();
getline(cin,str);
ReverseString1(str);
cout<<str<<endl;
cout<<"enter 0 to exit or 1 to continue"<<endl;
cin>>nflag;
} return ;
}

string的实现的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. C#泛型文章汇总

    http://www.cnblogs.com/kid-li/archive/2006/11/29/577045.html http://www.blogjava.net/Jack2007/archiv ...

  2. 集​群​t​o​m​c​a​t​+​a​p​a​c​h​e​配​置​文​档

    http://wenku.baidu.com/link?url=M_Lt07e-9KTIHucYgJUCNSxkjWThUuQ2P8axn8q6YmY_yQw7NmijQoDA2wKmi_FQUxwO ...

  3. an interview question(3)

    最近看了些C面试题顺便复习一下C语言,现贴一些出来和大家分享. #include <stdio.h> void main () { ,,,,};--------- *(ptr++)+=; ...

  4. ROS学习笔记(四)——环境变量配置

    1.查看环境变量配置情况,其实并没有什么卵用 $ export | grep ROS 或者用 $ printenv | grep ROS2.配置环境变量??$ source /opt/ros/indi ...

  5. Tableau(数据抽取)

    如果启用的是标准的企业数据库,TABLEAU中做实时分析会比较困难,例如以下情况:(1)不在办公室,无法连接到数据库:(2)在Microsoft SQL Server或者Oracle,在数据库很大或者 ...

  6. MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器 ...

  7. angularjs自定义过滤器

    实现一个按输入框中的数据筛选的功能,筛选可按电影的名称.年份.评分检索框: <input type="text" placeholder="可检索名字评分和年份&q ...

  8. 谈谈javascript中的日期Date对象

    一.日期对象  在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间.  日期对象的创建:  new Date();二.将日期对象转换为字符串  将日期对象转换为字 ...

  9. 删除Kafka的topic

    刚接触Kafka,开始认为删除一个topic只是运行一下Kafka-topic.sh的delete命令就行了,但是,事实却不是这样,会出现两种情况:(1) 如果topic没有使用过即没有传输过消息,可 ...

  10. [HTML/HTML5]3 页面结构

    在HTML5之前,主要的容器元素是div元素,但在HTML5中提供了数种其它容器元素供我们使用. 因此,当组织Web页面结构时,首先使用HTML将内容分成多部分,然后在对其使用CSS应用样式和格式. ...