2019-08-16 11:56:20 wjy741223284 阅读数 177
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    79058 人正在学习 去看看 李宁

字符串的交换是指将两个字符串的内容互相交换。

字符串复制是指生成一个新的字符串其内容为原有字符串的内容。

#include <iostream>

int main()
{

	std::string str1 = "Hello ";
	std::string str2 = "World!";

	//以下将字符串str1的内容与字符串str2的内容进行交换
	swap(str1,str2);
	std::cout << str1 << std::endl;
	std::cout << str2 << std::endl;


	std::string str3 = "Hello World!";
	std::string str4;

	//以下将字符串str3中的所有字符复制到字符串str4中
	str4.assign(str3);
	std::cout <<str4 << std::endl;


	std::string str5;

	//以下是将字符串str3中的第2个字符开始连续8个字符复制到字符串str5中。
	str5.assign(str3,2,8);
	std::cout << str5 << std::endl;

	return 0;
}

2016-11-09 01:26:45 earbao 阅读数 739
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    79058 人正在学习 去看看 李宁
#pragma once

#define _CRT_SECURE_NO_WARNINGS 

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;


class errorOutRange
{
	
};
//字符串模板库的实现 参考http://edu.51cto.com/lesson/id-86642.html
template <class T=char>
class String
{
public:
	String();
	~String();
	String(const T* p);//char* 构造函数

	String(const String& str);//拷贝构造函数
	void operator = (const String& str);//赋值构造函数

	String operator + (const String& str);
	void operator += (const String& str);

	T operator [](int id);

	void show(); 
	//流式运算符重载
	friend ostream& operator <<(ostream& o, const String<T> &str)
	{
		o << str.pStart;
		return o;
	};
	
private:
	T* pStart=nullptr;
	int length = 0;
};


#define _CRT_SECURE_NO_WARNINGS 

#include "String.h"

template <class T>
String<T>::String() :pStart(nullptr),length(0)
{
}

template <class T>
String<T>::String(const T* p)
{
	//c++需要严格注意类型匹配。
	if (strcmp(typeid(T).name(), "char")==0)
	{
		this->length = strlen(reinterpret_cast<const char*>(p))+1;//字符串长度需要加1 \0
		this->pStart = new T[this->length];

		strcpy(reinterpret_cast<char*>(this->pStart), reinterpret_cast<const char*>(p));

	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		this->length = wcslen(reinterpret_cast<const wchar_t*>(p))+1;
		this->pStart = new T[this->length];
		wcscpy(reinterpret_cast<wchar_t*>(this->pStart), reinterpret_cast<const wchar_t*>(p));

	}
	else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}
}

template <class T>
void String<T>::operator = (const String& str)
{
	//释放原来的数据
	if (this->pStart != nullptr)
	{
		delete[] this->pStart;
	}
	this->length = 0;


	this->length = str->length;
	this->pStart = new T[this->length];
	if (strcmp(typeid(T).name(), "char") == 0)
	{
		strcpy(reinterpret_cast<char*>(this->pStart), reinterpret_cast<const char*>(str->pStart));

	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		wscpy(reinterpret_cast<wchar_t*>(this->pStart), reinterpret_cast<const wchar_t*>(str->pStart));

	}
	else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}

}
template <class T>
T String<T>::operator [](int id)
{
	if (id<0 || id>=this->length)
	{
		throw errorOutRange();
	}
	return this->pStart[id];
}

template <class T>
String<T>::String(const String& str)
{
	//拷贝构造函数需要释放原来的数据
	if (this->pStart != nullptr)
	{
		delete[] this->pStart;
	}
	this->length = 0;

	this->length = str.length;
	this->pStart = new T[this->length];

	if (strcmp(typeid(T).name(), "char") == 0)
	{
		strcpy(reinterpret_cast<char*>(this->pStart), reinterpret_cast<const char*>(str.pStart));

	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		wcscpy(reinterpret_cast<wchar_t*>(this->pStart), reinterpret_cast<const wchar_t*>(str.pStart));

	}else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}
}

template <class T>
void String<T>::show()
{
	if(strcmp(typeid(T).name(), "char") == 0)
	{
		cout << reinterpret_cast<char*>(this->pStart) << endl;
	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		wcout << reinterpret_cast<wchar_t*>(this->pStart) << endl;
	}else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}
}

template <class T>
String<T>::~String()
{
	if (this->pStart!= nullptr)
	{
		delete[] this->pStart;
	}
}


//返回对象需要实例化 String<T>
template <class T>
String<T> String<T>::operator + (const String& str)
{
	String<T> strTemp;
	strTemp.length = this->length + str.length - 1;
	strTemp.pStart = new T[strTemp.length];
	if (strcmp(typeid(T).name(), "char") == 0)
	{
		strcpy(reinterpret_cast<char*>(strTemp.pStart), reinterpret_cast<char*>(this->pStart));
		strcat(reinterpret_cast<char*>(strTemp.pStart), reinterpret_cast<const char*>(str.pStart));
	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		wcscpy(reinterpret_cast<wchar_t*>(strTemp.pStart), reinterpret_cast<wchar_t*>(this->pStart));
		wcscat(reinterpret_cast<wchar_t*>(strTemp.pStart), reinterpret_cast<const wchar_t*>(str.pStart));
	}
	else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}
		
	//会调用拷贝构造函数
	return strTemp;

}

template <class T>
void String<T>::operator += (const String& str)
{
	//"123"  4 "1234" 5
	this->length += (str.length-1);//长度

	T* temp = new T[this->length];
	if (strcmp(typeid(T).name(), "char") == 0)
	{
		strcpy(reinterpret_cast<char*>(temp), reinterpret_cast<char*>(this->pStart));
		strcat(reinterpret_cast<char*>(temp), reinterpret_cast<const char*>(str.pStart));
		delete[] this->pStart;

		this->pStart = temp;//拷贝
	}
	else if (strcmp(typeid(T).name(), "wchar_t") == 0)
	{
		wcscpy(reinterpret_cast<wchar_t*>(temp), reinterpret_cast<wchar_t*>(this->pStart));
		wcscat(reinterpret_cast<wchar_t*>(temp), reinterpret_cast<const wchar_t*>(str.pStart));
		
		delete[] this->pStart;
		this->pStart = temp;//拷贝

	}
	else
	{
		cout << "类型不匹配,请检查输入的类型" << endl;
	}


}

#define _CRT_SECURE_NO_WARNINGS 

#include <iostream>
#include <string>
#include <cstdlib>

#include "String.h"
#include  "String.cpp"  //template类需要连接源文件
using namespace std;

int main1()
{
	//String<char> str1;
	//String<wchar_t> str2;
	String<char> str1("hello");
	str1.show();
	String<wchar_t> str2(L"world");
	str2.show();
	cin.get();
	return 0;
}
void test()
{
	String<char> str1("test");
	str1.show();
	
}
void main2()
{
	String<char> str1("hello");
	str1.show();
	String<wchar_t> str2(L"world");
	str2.show();
	test();

	cin.get();
}

void main3()
{
	String<char> str1("hello");
	String<char> str2("world");
	str1 += str2;
	str1.show();

	(str1 + str2).show();

	String<char> str3=str1+str2;
	str3.show();
	cin.get();
}
void main4()
{
	String<wchar_t> str1(L"hello");
	String<wchar_t> str2(L"java");
	str1 += str2;
	str1.show();

	(str1 + str2).show();

	String<wchar_t> str3 = str1 + str2;
	str3.show();
	cin.get();
}

void main()
{
	//默认模板
	String<> str1("hello");
	String<> str2("world");
	
	String<> str3 = str1 + str2;
	str3.show();

	str1 += str2;
	str1.show();

	//测试流运算符。
	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;
	cin.get();
}
学习c++模板和运算符重载的例子
2015-04-06 12:36:03 u010439954 阅读数 223
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    79058 人正在学习 去看看 李宁

string类方法汇总

构造函数 产生或复制字符串

析构函数 销毁字符串

=、assign 赋予新值

swap 交换字符串

+=、append()、push_bash() 添加字符

insert() 插入字符

erase() 删除字符

clear() 移除全部字符

resize() 改变字符数目

replace() 替换字符

size()、length() 返回字符数目

max_size() 返回字符的最大可能个数

empty() 判断字符串是否为空

capacity() 返回重新分配前的字符容量

reserve() 保留内存以存储的一定数量字符

[]、at(n) 存取单一字符

>>、getline() 从stream读取某值

copy() 复制字符串

c_str() 将内容复制成char*

data() 将内容以字符串形式返回

substr() 返回子字符串

find() 查询子字符串或字符

begin()、end() 提供正向迭代器支持


#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("12345678");
	char   ch[]="abcdefgh";
	string  a;

	string str1(str);						//全复制
	string str2(str,2,5);					//从第2个复制到第5个
	string str3(ch,5);						//复制前5个元素
	string str4(5,'X');						//复制5个'XXXXX'
	string str5(str.begin(),str.end());		//全复制
	cout<<endl;
//////////////////////////////////////////////////////大小和容量
	string str_num("12345678");

	cout<<"size="<<str_num.size()<<endl;
	cout<<"length="<<str_num.length()<<endl;
	cout<<"maxsize="<<str_num.max_size()<<endl;
	cout<<"capacity="<<str_num.capacity()<<endl;
	cout<<endl;
///////////////////////////////////////////访问
	string s("abcde");
	char& r = s[2];
	char* p = &s[3];
	r = 'X';
	*p = 'Y';
	cout<<s<<endl;
	cout<<endl;
////////////////////////////////////////////////比较
	string A("aBcdef");
	string B("AbcdEf");
	cout<<A.compare(B)<<endl;			//完全对比
	cout<<A.compare(1,5,B)<<endl;		//Bcdef和bcdEf
	cout<<A.compare(1,5,B,4,2)<<endl;	//Bcdef和Ef
	cout<<A.compare(2,2,B,2,2)<<endl;	//cd和cd
	cout<<endl;
/////////////////////////////////////////////////////assign()
	string ss1("12345678");
	string ss2;
	ss2.assign(ss1);
	cout<<ss2<<endl;

	ss2.assign(ss1,3,3);
	cout<<ss2<<endl;

	ss2.assign(ss1,2,ss1.npos);
	cout<<ss2<<endl;

	ss2.assign(5,'X');
	cout<<ss2<<endl;

	ss2.assign(ss1.begin(),ss1.end());
	cout<<ss2<<endl;
	cout<<endl;
////////////////////////////////////////////////erase()
	string s_erase("12345678");
	s_erase.erase(3);						//删除第3个以后字符
	cout<<s_erase<<endl;

	string s_erase1("12345678");
	s_erase1.erase(3,2);					//删除第3个以后的两个字符
	cout<<s_erase1<<endl;
	cout<<endl;
//////////////////////////////////////////////insert()
	string s_insert1("ello");
	string insert1("H");
	insert1.insert(1,s_insert1);
	cout<<insert1<<endl;

	insert1="H";
	insert1.insert(1,"yanjhj",3);
	cout<<insert1<<endl;

	insert1="H";
	insert1.insert(1,A,2,2);
	cout<<insert1<<endl;

	insert1="H";;
	insert1.insert(1,5,'c');
	cout<<insert1<<endl;
	cout<<endl;
//////////////////////////////////////////append()
	string s_append("ello");
	string append1("H");
	append1.append(s_append);
	cout<<append1<<endl;
	
	append1="HHH";
	append1.append("123456",1,3);
	cout<<append1<<endl;

	append1="H";
	append1.append(10,'a');
	cout<<append1<<endl;
	cout<<endl;
//////////////////////////////////repalce()

	string var("abcdefg");
	string re("123");
	var.replace(3,3,re);
	cout<<var<<endl;

	var = "abcdefg";
	re = "1234";
	var.replace(3,1,re.c_str(),1,3);
	cout<<var<<endl;

	var = "abcdefg";
	var.replace(3,1,5,'X');
	cout<<var<<endl;
	cout<<endl;
/////////////////////////////////find()
	string s_find("today,w will go to swing!");
	int num = s_find.find('w',9);				//从第9个字符开始搜索
	cout<<num<<endl;

	num = s_find.find('w',0);					//逆向搜索							
	cout<<num<<endl;

	return 0;
}



2017-04-06 16:00:00 bianjingshan 阅读数 687
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    79058 人正在学习 去看看 李宁

字符集发展历程:

  • ASCII。在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。
  • Unicode。ASCII是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的亚洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO 8859-1Latin 1,也简称为ISOLatin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语字母表(或pictograms)就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。但是,UNICODE并没有提供对诸如Braille,Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom, Akkadian, Aramaic, Babylonian Cuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老文字。
  • UTF。对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。

编码:

如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。
UTF-8编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8转换表表示如下:

Unicode/UCS-4
Unicode/UCS-4
 
bit数
UTF-8
byte数
备注
0000 ~
007F
0~7
0XXX XXXX
1
 
0080 ~
07FF
8~11
110X XXXX
10XX XXXX
2
 
0800 ~
FFFF
12~16
1110XXXX
10XX XXXX
10XX XXXX
3
基本定义范围:0~FFFF
1 0000 ~
1F FFFF
17~21
1111 0XXX
10XX XXXX
10XX XXXX
10XX XXXX
4
Unicode6.1定义范围:0~10 FFFF
20 0000 ~
3FF FFFF
22~26
1111 10XX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
5
说明:此非unicode编码范围,属于UCS-4 编码
早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限)。尽管如此,2003年11月UTF-8 被 RFC 3629 重新规范,只能使用原来Unicode定义的区域, U+0000到U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8序列中
400 0000 ~
7FFF FFFF
27~31
1111 110X
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
6


VS2010的字符集:

代码中直接定义的字符串是GB2312字符集,字符串前面加L表示该字符串是Unicode字符串,_T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L

	char *p_string_E="A"; //GB2312编码
	char *p_string_C="码"; //GB2312编码
	wchar_t *p_string_C_L=L"码"; //Unicode编码

Linux的字符集

Linux定义的字符串,使用gnu编译时字符集由文件的编码方式决定。

字符集转换:

GB2312转Unicode:使用windows API::MultiByteToWideChar

bool GB2312ToUnicode(char *input_string, wchar_t *out_buffer, int out_buffer_len)
{
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, input_string, -1, NULL, 0);
    if(nwLen>=out_buffer_len)
    {
        return false;
    }
    ZeroMemory(out_buffer, nwLen * 2 + 2);  
    ::MultiByteToWideChar(CP_ACP, 0, input_string, strlen(input_string), out_buffer, nwLen);  
    return true;
}



GB2312转UTF-8:使用windows API::MultiByteToWideChar和WideCharToMultiByte,先转成Unicode,再从Unicode转成UTF8

bool GB2312ToUTF8(char *input_string, char *out_buffer, int out_buffer_len)
{
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, input_string, -1, NULL, 0);
    wchar_t * pwBuf = new wchar_t[nwLen + 1];//+1的作用是保证字符串有结束符
    ZeroMemory(pwBuf, nwLen * 2 + 2);  
    ::MultiByteToWideChar(CP_ACP, 0, input_string, strlen(input_string), pwBuf, nwLen);  
    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);  
    if(nLen>=out_buffer_len)
    {
        delete []pwBuf;
        return false;
    }
    ZeroMemory(out_buffer, nLen + 1);  
    ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, out_buffer, nLen, NULL, NULL);  
    delete []pwBuf;
    return true;
}

测试字符集编码:

#include "stdafx.h"
#include "string.h"
#include <stdio.h>
#include <windows.h>

bool GB2312ToUTF8(char *input_string, char *out_buffer, int out_buffer_len)
{
	int nwLen = ::MultiByteToWideChar(CP_ACP, 0, input_string, -1, NULL, 0);
	wchar_t * pwBuf = new wchar_t[nwLen + 1];//+1的作用是保证字符串有结束符
	ZeroMemory(pwBuf, nwLen * 2 + 2);  
	::MultiByteToWideChar(CP_ACP, 0, input_string, strlen(input_string), pwBuf, nwLen);  
	int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);  
	if(nLen>=out_buffer_len)
	{
		delete []pwBuf;
		return false;
	}
	ZeroMemory(out_buffer, nLen + 1);  
	::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, out_buffer, nLen, NULL, NULL);  
	delete []pwBuf;
	return true;
}

bool GB2312ToUnicode(char *input_string, wchar_t *out_buffer, int out_buffer_len)
{
	int nwLen = ::MultiByteToWideChar(CP_ACP, 0, input_string, -1, NULL, 0);
	if(nwLen>=out_buffer_len)
	{
		return false;
	}
	ZeroMemory(out_buffer, nwLen * 2 + 2);  
	::MultiByteToWideChar(CP_ACP, 0, input_string, strlen(input_string), out_buffer, nwLen);  
	return true;
}


void PrintDataBuffer(char *buffer_name, void *p_buffer, int buffer_len)
{
	printf("%s[%d]:", buffer_name, buffer_len);
	unsigned char *p_temp=(unsigned char *)p_buffer;
	for(int iloop=0;iloop<buffer_len;iloop++)
	{
		printf("%02X ", p_temp[iloop]);
	}
	printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	char *p_string_E="A"; //GB2312编码
	char *p_string_C="码"; //GB2312编码
	wchar_t *p_string_C_L=L"码"; //Unicode编码
	

	PrintDataBuffer("原始编码\"A\"", p_string_E, strlen(p_string_E));
	PrintDataBuffer("原始编码\"码\"", p_string_C, strlen(p_string_C));
	PrintDataBuffer("原始编码L\"码\"", p_string_C_L, sizeof(wchar_t)*wcslen(p_string_C_L));

	wchar_t wchar_E_buffer[32];
	wchar_t wchar_C_buffer[32];
	GB2312ToUnicode(p_string_E, wchar_E_buffer, 32);
	GB2312ToUnicode(p_string_C, wchar_C_buffer, 32);
	PrintDataBuffer("Unicode编码\"A\"", wchar_E_buffer, sizeof(wchar_t)*wcslen(wchar_E_buffer));
	PrintDataBuffer("Unicode编码\"码\"", wchar_C_buffer, sizeof(wchar_t)*wcslen(wchar_C_buffer));

	char utf8_E_buffer[32];
	char utf8_C_buffer[32];
	GB2312ToUTF8(p_string_E, utf8_E_buffer, 32);
	GB2312ToUTF8(p_string_C, utf8_C_buffer, 32);
	PrintDataBuffer("UTF-8编码\"A\"", utf8_E_buffer, strlen(utf8_E_buffer));
	PrintDataBuffer("UTF-8编码\"码\"", utf8_C_buffer, strlen(utf8_C_buffer));
	getchar();
	return 0;
}




2019-07-07 12:08:13 qq_43488547 阅读数 979
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    79058 人正在学习 去看看 李宁

字符串内容的变化包括修改和替换两种。本节将分别讲解字符串内容的修改和字符串内容的替换。
字符串内容的修改
可以通过使用多个函数修改字符串的值。例如 assign(),operator=,erase(),交换(swap),插入(insert)等。另外,还可通过 append() 函数添加字符。

下面逐一介绍各成员函数的使用方法。
assign()函数
使用 assign() 函数可以直接给字符串赋值。该函数既可以将整个字符串赋值给新串,也可以将字符串的子串赋值给新串。其在 basic_string 中的原型为:

basic_string& assign (const E*s); //直接使用字符串赋值
basic_string& assign (const E*s, size_type n);
basic_string& assign (const basic_string & str, size_type pos, size_type n);
//将str的子串赋值给调用串
basic_string& assign (const basic_string& str);    //使用字符串的“引用”賦值
basic_string& assign (size_type n, E c) ; //使用 n个重复字符賦值
basic_string& assign (const_iterator first, const_iterator last);    //使用迭代器赋值

以上几种方法在例 1 中均有所体现。请读者参考下述代码。

【例 1】

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 ("123456");
    string str;
    str.assign (str1); //直接赋值
    cout << str << endl;
    str.assign (str1, 3, 3); //赋值给子串
    cout << str << endl;
    str.assign (str1,2,str1.npos);//赋值给从位置 2 至末尾的子串
    cout << str << endl;
    str.assign (5,'X'); //重复 5 个'X'字符
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE)); //从第 1 个至倒数第 2 个元素,赋值给字符串 str
    cout << str << endl;
    return 0;
}

operator= 函数
operator= 的功能就是赋值。
erase()函数
erase() 函数的原型为:

    iterator erase (iterator first, iterator last);
    iterator erase (iterator it);
    basic_string& erase (size_type p0 = 0, size_type n = npos);

erase() 函数的使用方法为:

str.erase (str* begin(), str.end());
    或 str.erase (3);

swap()函数
swap()函数的原型为:

void swap (basic_string& str);

swap()函数的使用方法为:

string str2 ("abcdefghijklmn");
str.swap (str2);

insert()函数
insert () 函数的原型为:

basic_string& insert (size_type p0 , const E * s); //插人 1 个字符至字符串 s 前面
basic_string& insert (size_type p0 , const E * s, size_type n); // 将 s 的前 3 个字符插入p0 位置
basic_string& insert (size_type p0, const basic_string& str);
basic_string& insert (size_type p0, const basic_string& str,size_type pos, size_type n); //选取 str 的子串
basic_string& insert (size_type p0, size_type n, E c); //在下标 p0 位置插入  n 个字符 c
iterator insert (iterator it, E c); //在 it 位置插入字符 c
void insert (iterator it, const_iterator first, const_iterator last); //在字符串前插入字符
void insert (iterator it, size_type n, E c) ; //在 it 位置重复插入 n 个字符 c

insert() 函数的使用方法为:

 string A("ello");
    string B ;
    B.insert(1,A);
    cout << B << endl;
    A = "ello";
    B = "H";
    B.insert (1,"yanchy ",3);
    cout<< B <<endl;
    A = "ello";
    B = "H";
    B.insert (1,A,2,2);
    cout << B << endl;
    A="ello";
    B.insert (1 , 5 , 'C');
    cout << B << endl;
    A = "ello";
    string::iterator it = B.begin () +1;
    const string:: iterator itF = A.begin();
    const string:: iterator itG = A.end();
    B.insert(it,itF,itG);
    cout << B << endl;

append 函数
append() 函数的原型为:

 basic_string& append (const E * s); //在原始字符串后面追加字符串s
    basic_string& append (const E * s, size_type n);//在原始字符串后面追加字符串 s 的前 n 个字符
    basic_string& append (const basic_string& str, size_type pos,size_type n);//在原始字符串后面追加字符串 s 的子串 s [ pos,…,pos +n -1]
    basic_string& append (const basic_string& str);
    basic_string& append (size_type n, E c); //追加 n 个重复字符
    basic_string& append (const_iterator first, const_iterator last); //使用迭代器追加
    
    append() 函数的使用方法为:
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append(A);
    cout << B << endl;
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append("12345",2);
    cout << B << endl;
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append("12345",2,3);
    cout << B << endl;
    A = "ello";
    B = "H";
    cout << A << endl;
    cout << B << endl;
    B.append (10, 'a');
    cout << B << endl;
    A = "ello";
    B = 'H';
    cout << A << endl ;
    cout << B << endl;
    B.append(A.begin(), A, end());
    cout << B << endl;

下面通过一个完整的例子介绍这些函数的使用:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string str1 ("123456");
    string str2 ("abcdefghijklmn");
    string str;
    str.assign(str1);
    cout << str << endl;
    str.assign (str1 , 3, 3);
    cout << str << endl;
    str.assign (str1, 2, str1.npos);
    cout << str << endl;
    str.assign (5, 'X');
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE));
    cout << str << endl;
    str = str1;
    cout << str << endl;
    str.erase(3);
    cout << str << endl;
    str.erase (str.begin (), str.end());
    cout << ":" << str << ":" << endl;
    str.swap(str2);
    cout << str << endl;
    string A ("ello");
    string B ("H");
    B.insert (1, A);
    cout << B << endl;
    A = "ello";
    B ='H';
    B.insert (1, "yanchy ", 3);
    cout << "插入: " << B << endl;
    A = "ello";
    B = "H";
    B.insert(1,A,2,2);
    cout << "插入:" << B << endl;
    A = "ello";
    B = "H";
    B.insert (1,5,'C');
    cout << "插入:" << B << endl;
    A = "ello";
    B = "H";
    string::iterator it = B.begin () +1;
    const string::iterator itF = A.begin ();
    const string::iterator itG = A.end ();
    B.insert(it,itF,itG);
    cout<<"插入:"<< B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A <<", B = " << B << endl ;
    B.append (A);
    cout << "追加:" << B << endl;
    B = "H";
    cout << "A = "<< A << ", B= " << B << endl;
    B.append("12345", 2);
    cout << "追加:" << B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A << ", B= " << B << endl;
    B.append ("12345", 2, 3);
    cout << "追加:" << B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A <<", B = " << B << endl;
    B.append (10 , 'a');
    cout << "追加:"<< B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A << ", B = " << B << endl;
    B.append(A.begin() , A.end());
    cout << "追加:" << B << endl;
    cin.get();
    return 0;
}

程序运行结果:

123456
456
3456
XXXXX
12345
123456
123
::
abcdefghijklmn
Hello
插入: Hyan
插入:Hlo
插入:HCCCCC
插入:Hello
A = ello, B = H
追加:Hello
A = ello, B= H
追加:H12
A = ello, B= H
追加:H345
A = ello, B = H
追加:Haaaaaaaaaa
A = ello, B = H
追加:Hello

字符串内容的替换
如果在一个字符串中标识出具体位置,便可以通过下标操作修改指定位置字符的值,或者替换某个子串。完成此项操作需要使用 string 类的成员函数 replace()。

replace() 函数的原型如下:
basic_string& replace (size_type p0, size_type n0, const E * s); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换
basic_string& replace (size_type p0, size_type n0, const E *s, size_type n); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换 1 个字符
basic_string& replace (size_type p0, size_type n0, const basic_string& str); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换
basic_string& replace (size_type p0, size_type n0, const basic_string& str, size_type pos, size_type n); //使用串 str 的子串 str [pos, pos + n-1] 替换源串中的内容,从位置 p0 处开始替换,替换字符 n0 个
basic_string& replace (size_type p0, size_type n0, size_type n, E c); //使用 n 个字符 'c' 替换源串中位置 p0 处开始的 n0 个字符
basic_string& replace (iterator first0, iterator last0, const E * s);//使用迭代器替换,和 1) 用法类似
basic_string& replace (iterator first0, iterator last0, const E * s, size_type n);//和 2) 类似
basic_string& replace (iterator first0, iterator last0, const basic_string& str); //和 3) 类似
basic_string& replace (iterator first0, iterator last0, size_type n, E c); //和 5) 类似
basic_string& replace (iterator first0, iterator last0, const_iterator first, const_iterator last); //使用迭代器替换

该函数的使用方法参照下面的程序:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string var ("abcdefghijklmn");
    const string dest ("1234");
    string dest2 ("567891234");
    var.replace (3,3, dest);
    cout << "1: " << var << endl;
    var = "abcdefghijklmn";
    var.replace (3,1, dest.c_str(), 1, 3);
    cout << "2: " << var << endl;
    var ="abcdefghijklmn";
    var.replace (3, 1, 5, 'x');
    cout << "3: " << var << endl;
    string::iterator itA, itB;
    string::iterator itC, itD;
    itA = var.begin();
    itB = var.end();
    var = "abcdefghijklmn";
    var.replace (itA, itB, dest);
    cout << "4: " << var << endl;
    itA = var.begin ();
    itB = var.end();
    itC = dest2.begin () +1;
    itD = dest2.end ();
    var = "abodefghijklmn";
    var.replace (itA, itB, itC, itD);
    cout << "5: " << var << endl;
    var = "abcdefghijklmn";
    var.replace (3, 1, dest.c_str(), 4); //这种方式会限定字符串替换的最大长度
    cout <<"6: " << var << endl;
    return 0;
}

程序执行结果为:

    1: abc1234ghijklmn
    2: abc234efghijklmn
    3: abcxxxxxefghijklmn
    4: 1234
    5: 67891234efghijklmn
    6: abc1234efghijklmn

本节讲述了诸多可进行字符串内容的修改和替换的函数及其使用方法,并给出了例题。由于每个函数可能有多个原型,希望读者根据自己的情况,掌握其中的一种或两种,以满足自己使用的需要。同时,希望读者能够对照例题的执行效果,认真阅读本章节中的源代码,彻底掌握本节内容。

《C++ string类》

阅读数 2760

没有更多推荐了,返回首页