面试常常用到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. 两个平行div之间有间隙

    两个平行的div使用 display: inline-block 会导致元素之间有空隙解决方法: 父元素设置 font-size: 0;

  2. 1007. Maximum Subsequence Sum (25)

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  3. sql:sum(value)与count(letter),当用户不存在时查询到的值

    SELECT sum(value) FROM invoice where username='yueer' SELECT count(letters) FROM invoice where usern ...

  4. mysql字符串函数(转载)

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的 最左面字符的ASCII代码值.如果str是空字符串, 返回0.如果str是NULL,返回NULL. mysq ...

  5. 嵌入式Linux学习笔记(0)基础命令。——Arvin

    学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...

  6. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  7. JS在window和document的应用

    页面跳转: window.location.href('地址') window.open('地址', '_self') 打开新窗口: window.open('地址', '_blank') 只显示地址 ...

  8. js通过继承实现私有函数

    本文是原创文章,如需转载,请注明文章出处 主要思想就是在继承时,只开放共有的属性和方法,不开放另外某些函数,从而实现私有的作用. function A(){ this.x = 100; this.y ...

  9. 使用cocos2d-x c++ Android静态库

    在用cocos2d-x做Android开发时,每次clean后都会需要再次编译coco2d-x的库,十分耗时. 这里给出一个直接使用静态库而不用每次都编译源码的方法: 1\ 首先找到一个cocos2d ...

  10. selenium遇到readonly元素的输入

    方法:去掉该元素的readonly属性 使用js来去掉 ((JavaScriptExecutor ) driver).executeScript($("input#{放置元素的CLASS}[ ...