string的实现
面试常常用到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的实现的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- select 和 input 的不可编辑,input隐藏
select 没有readOnly属性 在jsp中 <select id="a" name="a" disabled="disabled&qu ...
- arm cache line,PLD指令
C中嵌入汇编PLD指令:asm("PLD [%0,#128]": :"r" (psrc) ); copy自官方文档: 4.2.7. PLD.PLDW 和 PLI ...
- usb中的传输模式
别人总结的一个usb传输模式,保存一下 usb中的endpoint(端点)和传输模式 端点: 端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO. 每个USB 外 ...
- java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
今天在用git merge 新代码后报了如下错误:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterE ...
- 整合TabBarController与NavigationController
一.项目结构 一开始创建一个空的项目
- jquery写的ajax
1.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8& ...
- MySQL FUNCTION 整理
-- 返回最后一个INSERT查询中, AUTO_INCREMENT列设置的第一个表的值. SELECT LAST_INSERT_ID();
- css学习笔记 7
background-position属性值为百分比的时候,第一个百分比表示水平方向的距离,第二个表示垂直方向上的距离. text-indent的主要作用是为段落设置首行缩进,只能应用于块级元素.该属 ...
- 商业信息管理系统 Bizagi 建模pattern
WCP 1- Sequence This pattern is used to model dependencies between tasks so that one task cannot sta ...
- java实现的类和表持久化
//映射的过程: package com.ly.orm; import java.lang.reflect.Field; import java.util.ArrayList; import java ...