c++_string类详解
string头文件

string头文件#include"string,h"这是C语言/C++中的字符串处理函数的头文件下面是大多数的头文件:可以参考.我也是从别的地方找的.哈哈.见笑啦!/******************************/C、传统C++#include<assert.h>//设定插入点#include<ctype.h>//字符处理#include<errno.h>//定义错误码#include<float.h>//浮点数处理#include<fstream.h>//文件输入/输出#include<iomanip.h>//参数化输入/输出#include<iostream.h>//数据流输入/输出#include<limits.h>//定义各种数据类型最值常量#include<locale.h>//定义本地化函数#include<math.h>//定义数学函数#include<stdio.h>//定义输入/输出函数#include<stdlib.h>//定义杂项函数及内存分配函数#include<string.h>//字符串处理#include<strstrea.h>//基于数组的输入/输出#include<time.h>//定义关于时间的函数#include<wchar.h>//宽字符处理及输入/输出#include<wctype.h>//宽字符分类/******************************/标准C++(同上的不再注释)#include<algorithm>//STL通用算法#include<bitset>//STL位集容器#include<cctype>#include<cerrno>#include<clocale>#include<cmath>#include<complex>//复数类#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<deque>//STL双端队列容器#include<exception>//异常处理类#include<fstream>#include<functional>//STL定义运算函数(代替运算符)#include<limits>#include<list>//STL线性列表容器#include<map>//STL映射容器#include<iomanip>#include<ios>//基本输入/输出支持#include<iosfwd>//输入/输出系统使用的前置声明#include<iostream>#include<istream>//基本输入流#include<ostream>//基本输出流#include<queue>//STL队列容器#include<set>//STL集合容器#include<sstream>//基于字符串的流#include<stack>//STL堆栈容器#include<stdexcept>//标准异常类#include<streambuf>//底层输入/输出支持#include<string>//字符串类#include<utility>//STL通用模板类#include<vector>//STL动态数组容器#include<cwchar>#include<cwctype>using namespace std;/******************************/C99增加#include<complex.h>//复数处理#include<fenv.h>//浮点环境#include<inttypes.h>//整数格式转换#include<stdbool.h>//布尔环境#include<stdint.h>//整型环境#include<tgmath.h>//通用类型数学宏/******************************/我的回答可能不是很好的.希望见谅啊.能力有限和碰巧遇到你的问题.哈哈哈.我要被人笑死的......如果有什么疑问,可以通过搜索引擎找找再问,毕竟那样可能会有很好的答案.#include<intrins.h>这个头文件主要是包含了有关51单片机的几条汇编语句的C语言调用接口,是直接编译成对应的汇编语句的。
CString_与其他类型的转换

一.VC常用数据类型列表二.常用数据类型转化2.1数学类型变量与字符串相互转换_ttoi(CString->int) _tstof(CString->double)2.2CString及string,char *与其他数据类型的转换和操作●CString,string,char*的综合比较●数学类型与CString相互转化●CString与char*相互转换举例●CString 与 BSTR 型转换●VARIANT 型转化成 CString 型2.3 BSTR、_bstr_t与CComBSTR2.4 VARIANT 、_variant_t 与 COleVariant附录CString及字符串转及操作详解参考书籍:CSDN,<<MFC深入浅出(Second Edit)>> 一.VC常用数据类型列表int iTyep=3;char *szChar;itoa(iType,szChar,2);cout<<szChar;//输出为1010类似函数列表:_CRTIMP char * __cdecl _itoa(int, char *, int);//为了完整性,也列在其中_CRTIMP char * __cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * __cdecl _ltoa(long, char *, int);_CRTIMP char * __cdecl _i64toa(__int64, char *, int);_CRTIMP char * __cdecl _ui64toa(unsigned __int6 4, char *, int);_CRTIMP wchar_t * __cdecl _i64tow(__int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _ui64tow(unsigned __int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _itow (int, wc har_t *, int);//转换为长字符串类型_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);_CR TIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);还有很多,请自行研究(2)将字符串类型转换为数学类型变量可以用以下一些函数:举例: _CRTIMP int __cdecl atoi(co nst char *);//参数一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar); cout<<temp;类似的函数列表:_CRTIMP int __cdecl atoi(const char *);_CRTIMP double __cd ecl atof(const char *);_CRTIMP long __cdecl atol(const char *);_CRTIMP long double __cdecl _atold(const char *);_CRTIMP __int64 __cdecl _atoi64(const char *);_CRTIMP double __cdecl s trtod(const char *, char **);//_CRTIMP long __cdecl strtol(const char *, char **, int);//_ CRTIMP long double __cdecl _strtold(const char *, char **);_CRTIMP unsigned long __cdecl str toul(const char *, char **, int);_CRTIMP double __cdecl wcstod(const wchar_t *, wchar_t **); //长字符串类型转换为数学类型_CRTIMP long __cdecl wcstol(const wchar_t *, wchar_t **, int); _CRTIMP unsigned long __cdecl wcstoul(const wchar_t *, wchar_t **, int);_CRTIMP int __cdecl _wtoi(const wchar_t *);_CRTIMP long __cdecl _wtol(const wchar_t *);_CRTIMP __int64 __cdecl _wtoi64(const wchar_t *);还有很多,请自行研究2.2.CString及string,char *与其他数据类型的转换和操作(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章.地址: /joise/或参考附录:(2)转换:●数学类型与CString相互转化数学类型转化为CString可用Format函数,举例:CString s;int i = 64;s.Format("%d", i)CString转换为数学类型:举例CString strValue("1.234");double dblValue;dblValue = atof((LPCTSTR)strValue);●CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString// 进行强制转换.szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char[10];memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar;●CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.B STR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。
C语言--字符串详解

C语⾔--字符串详解 字符串是⼀种⾮常重要的数据类型,但是C语⾔不存在显式的字符串类型,C语⾔中的字符串都以字符串常量的形式出现或存储在字符数组中。
同时,C 语⾔提供了⼀系列库函数来对操作字符串,这些库函数都包含在头⽂件 string.h 中。
⼀、字符串常量和字符数组1.1、什么是字符串常量 C 语⾔虽然没有字符串类型,但是 C语⾔提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。
字符串常量是不可被修改的,⼀般⽤⼀对双引号(" ")括起的⼀串字符来表⽰字符串常量,如: "Hello!"、"\aWarning!\a"、"123abc\n"、"" 字符串常量可以为空,如""就是⼀个空的字符串常量,但是即使为空,还是存在⼀个终⽌符 NUL 的。
(在 C 语⾔中,常⽤转义字符 \0来表⽰ NUL)1.2、字符串常量与指针 字符串常量与指针关系密切,因为字符串常量的值,实际上表⽰的是存储这些字符的内存空间的地址,更准确地说是字符串常量中第 1个字符的地址,⽽不是这些字符本⾝。
因此,在 C 语⾔中是不能直接进⾏字符串赋值的(因为没有字符串类型嘛)。
在 C 语⾔中,常通过声明⼀个指向 char 类型的指针并将其初始化为⼀个字符串常量的⽅式来访问⼀个字符串:char *message = "Hello World!";// 上⾯的语句也可以拆分成下⾯两句char *message;message = "Hello World!"; // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作 上述语句声明了⼀个指向 char 类型的指针,并⽤字符串常量中第 1 个字符的地址对该指针进⾏初始化。
可以通过字符指针 message 来访问字符串常量:#include <stdio.h>int main(){ char *message = "Hello World!"; printf("%s\n",message); while(*message != '\0'){ printf("%c ",*message++); } printf("\n"); return0;}/* output:* Hello World!* H e l l o W o r l d !*/ 这段代码,使⽤字符指针遍历了字符串常量中的每⼀个字符。
c_str函数

c_str函数c_str()函数是C++ STL(Standard Template Library)库中的一个函数,它主要用于将字符串类型的字符数组(包括C++字符串和C字符数组)转换为C类型字符串,即以'\0'结尾的字符数组。
在这篇文章中,我们将详细介绍c_str()函数及其用途、使用方法和注意事项。
c_str()函数的主要用途是将C++的string类型转换为C风格的字符串类型,也就是将string类型的字符串转换为const char类型的字符串,便于和C语言中的函数交互和传递参数。
C++中的string类型和C语言中的字符串类型的最大区别是,string类型是一个类,而C语言中的字符串类型只是一个字符序列,以'\0'结尾。
而C++中的string类型默认不以'\0'结尾,所以它不能像C语言中的字符串那样直接传递给C语言库函数使用。
为了解决这个问题,我们必须使用c_str()函数将string类型转换为C风格的字符串类型。
c_str()函数的用法非常简单,只需要在string变量后添加.c_str()即可。
例如:```C++std::string str = "Hello, world!";const char* cstr = str.c_str();```在这个例子中,我们先定义了一个string类型的变量str,并将其初始化为“Hello, world!”字符串。
然后,我们使用c_str()函数将str转换为C风格的字符串类型,并将结果保存在一个const char指针变量cstr中。
1. 返回值是const char*类型c_str()函数的返回类型是const char *类型,也就是指向一段以'\0'结尾的字符数组的指针。
由于返回的指针是指向string对象内部的字符数组,因此不能修改该指针指向的内容。
C++string类成员函数c_str()的用法

C++string类成员函数c_str()的⽤法1.string类成员函数c_str()的原型:const char *c_str()const;//返回⼀个以null终⽌的c字符串2.c_str()函数返回⼀个指向正规c字符串的指针,内容和string类的本⾝对象是⼀样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式;3.操作c_str()函数的返回值时,只能使⽤c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使⽤后被析构函数释放掉,那么你所指向的内容就具有不确定性.eg: char * name[20];string ptr = "tongnono";strcpy(name,ptr.c_str());//c_str()返回的是⼀个临时的指针变量,不能对其操作.语法:const char *c_str();c_str()函数返回⼀个指向正规C字符串的指针常量, 内容与本string串相同.这是为了与c语⾔兼容,在c语⾔中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:⼀定要使⽤strcpy()函数等来操作⽅法c_str()返回的指针⽐如:最好不要这样:char* c;string s="1234";c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错——将⼀个const char *赋与⼀个char *。
应该这样⽤:char c[20];string s="1234";strcpy(c,s.c_str());这样才不会出错,c_str()返回的是⼀个临时指针,不能对其进⾏操作再举个例⼦c_str() 以 char* 形式传回 string 内含字符串如果⼀个函数要求char*参数,可以使⽤c_str()⽅法:string s = "Hello World!";printf("%s", s.c_str()); //输出 "Hello World!"⽐如定义⼀个函数func(const char *s){ //s+1这个指针是对的};func(string s){//s+1是错的};主函数中: string str;调⽤这个函数时可以为 func(s.c_str());。
C语言字符串替换:字符,字符串,字符数组详解

C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。
本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。
⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。
(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。
"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。
CC++中关于std::string的compare陷阱示例详解

CC++中关于std::string的compare陷阱⽰例详解前⾔C++ 语⾔是个⼗分优秀的语⾔,但优秀并不表⽰完美。
还是有许多⼈不愿意使⽤C或者C++,为什么?原因众多,其中之⼀就是C/C++的⽂本处理功能太⿇烦,⽤起来很不⽅便。
以前没有接触过其他语⾔时,每当别⼈这么说,我总是不屑⼀顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触 perl, php, 和Shell脚本以后,开始理解了以前为什么有⼈说C++⽂本处理不⽅便了。
总之,有了string 后,C++的字符⽂本处理功能总算得到了⼀定补充,加上配合STL其他容器使⽤,其在⽂本处理上的功能已经与perl, shell, php的距离缩⼩很多了。
因此掌握string 会让你的⼯作事半功倍。
string简单使⽤其实,string并不是⼀个单独的容器,只是basic_string 模板类的⼀个typedef ⽽已,相对应的还有wstring, 你在string 头⽂件中你会发现下⾯的代码:extern "C++" {typedef basic_string <char> string;typedef basic_string <wchar_t> wstring;} // extern "C++"由于只是解释string的⽤法,如果没有特殊的说明,本⽂并不区分string 和 basic_string的区别。
string 其实相当于⼀个保存字符的序列容器,因此除了有字符串的⼀些常⽤操作以外,还有包含了所有的序列容器的操作。
字符串的常⽤操作包括:增加、删除、修改、查找⽐较、链接、输⼊、输出等。
下⾯话不多说了,来⼀起看看本⽂的正⽂。
场景1.std::string 我们经常⽤来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.2.通常情况下我们使⽤ std::string 的 compare ⽅法⽐较字符串, 但这个⽅法⽐较奥字符串是不可靠的.说明pare ⽅法和 strcmp并不相同, 它⽐较的是std::string size()⼤⼩⾥的所有字节.在size() 长度范围⾥, 如果有'\0'字符, ⼀样进⾏⽐较, 所有在不知道 std::string⾥是否存储纯字符串时, 最好先转换为const char* (调⽤c_str()) , 再调⽤ strcmp⽐较. 这个坑还是很吓⼈的.例⼦1.以下例⼦很好的说明在⽐较字符串时 compare并不适合.#include <string>#include <iostream>#include <string.h>int main(int argc, char const *argv[]){std::string str("hello");str.append(1,'\0');str.append(1,'i');std::cout << str.size() << std::endl;std::cout << str << std::endl;std::cout << pare("hello") << std::endl;std::cout << strcmp(str.c_str(),"hello") << std::endl;return 0;}输出:$ ./test-string.exe7hello2总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
c语言string类型的ipv6格式转为数组类型 -回复

c语言string类型的ipv6格式转为数组类型-回复如何将C语言中的string类型的IPv6格式转换为数组类型在网络编程中,IPv6是一个十六进制的地址,表示了网络上的唯一主机。
在C语言中,IPv6地址可以以字符串的形式表示,例如:"2001:0db8:85a3:0000:0000:8a2e:0370:7334"。
然而,对于某些网络编程任务,我们可能需要将这种字符串类型的IPv6地址转换为数组类型。
本文将为您提供一种方法来实现这个转换过程。
为了将字符串类型的IPv6地址转换为数组类型,我们可以按照以下步骤进行操作:步骤1:包含所需的头文件我们需要包含C标准库中的`string.h`头文件,以便使用其中的字符串处理函数。
c#include <string.h>步骤2:声明和初始化数组类型的IPv6地址我们需要使用一个数组来存储转换后的IPv6地址。
根据IPv6地址的长度,我们可以声明一个长度为16的unsigned char数组,用来存储每个十六进制字节。
cunsigned char ip6_addr[16] = {0};步骤3:将字符串转换为十六进制数组我们需要使用字符串处理函数`strtok()`和`sscanf()`来将字符串类型的IPv6地址转换为十六进制数组。
cchar* token = strtok(ipv6_str, ":");int i = 0;while (token != NULL) {sscanf(token, "02hhx", &ip6_addr[i++]);token = strtok(NULL, ":");}在上述代码中,`strtok(ipv6_str, ":")`函数将IPv6地址字符串根据`:`分隔为多个部分,并返回第一个部分的指针。
然后,`sscanf()`函数使用`02hhx`格式字符串将每个部分转换为无符号字符,并将其存储在`ip6_addr`数组中的相应位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.声明一个C++字符串声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。
上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。
String类的构造函数和析构函数如下:a) string s; //生成一个空字符串sb) string s(str) //拷贝构造函数生成str的复制品c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e) string s(cstr) //将C字符串作为s的初值f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num,c) //生成一个字符串,包含num个c字符h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值i) s.~string() //销毁所有字符,释放内存都很简单,我就不解释了。
2.字符串操作函数这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
a) =,assign() //赋以新值b) swap() //交换两个字符串的内容c) +=,append(),push_back() //在尾部添加字符d) insert() //插入字符e) erase() //删除字符f) clear() //删除全部字符g) replace() //替换字符h) + //串联字符串i) ==,!=,<,<=,>,>=,compare() //比较字符串j) size(),length() //返回字符数量k) max_size() //返回字符的可能最大个数l) empty() //判断字符串是否为空m) capacity() //返回重新分配之前的字符容量n) reserve() //保留一定量内存以容纳一定数量的字符o) [ ], at() //存取单一字符p) >>,getline() //从stream读取某值q) << //将谋值写入streamr) copy() //将某值赋值为一个C_strings) c_str() //将内容以C_string返回t) data() //将内容以字符数组形式返回u) substr() //返回某个子字符串v)查找函数w)begin() end() //提供类似STL的迭代器支持x) rbegin() rend() //逆向迭代器y) get_allocator() //返回配置器下面详细介绍:2.1 C++字符串和C字符串的转换C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。
c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。
C++字符串并不以’\0’结尾。
我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
由于只是简单介绍,详细介绍掠过,谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。
我详细解释。
2.2 大小和容量函数一个C++字符串存在三种大小:a)现有的字符数,函数是size()和length(),他们等效。
Empty()用来检查字符串是否为空。
b)max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。
我们一般情况下不用关心他,应该大小足够我们用的。
但是不够用的话,会抛出length_error异常c)capacity()重新分配内存之前 string所能包含的最大字符数。
这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。
重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。
还有必要再重复一下C++字符串和C字符串转换的问题,许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。
那么,这时候我们的处理方式是:如果此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。
当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。
同时我们也祈祷现在仍然使用C字符串进行编程的高手们(说他们是高手一点儿也不为过,也许在我们还穿开裆裤的时候他们就开始编程了,哈哈…)写的函数都比较规范,那样我们就不必进行强制转换了。
2.3元素存取我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。
但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。
而at()会检查,如果使用at()的时候索引无效,会抛出out_of_range异常。
有一个例外不得不说,const string a;的操作符[]对索引值是a.length()仍然有效,其返回值是’\0’。
其他的各种情况,a.length()索引都是无效的。
举例如下:const string Cstr(“const string”);string Str(“string”);Str[3]; //okStr.at(3); //okStr[100]; //未定义的行为Str.at(100); //throw out_of_rangeStr[Str.length()] //未定义行为Cstr[Cstr.length()] //返回‘\0’Str.at(Str.length());//throw out_of_rangeCstr.at(Cstr.length()) ////throw out_of_range我不赞成类似于下面的引用或指针赋值:char& r=s[2];char* p= &s[3];因为一旦发生重新分配,r,p立即失效。
避免的方法就是不使用。
2.4比较函数C++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string 的比较(如 str<”hello”)。
在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。
字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。
同时,string(“aaaa”) 另一个功能强大的比较函数是成员函数compare()。
他支持多参数处理,支持用索引值和长度定位子串来进行比较。
他返回一个整数来表示比较结果,返回值意义如下:0-相等〉0-大于 <0-小于。
举例如下:string s(“abcd”);pare(“abcd”); //返回0pare(“dcba”); //返回一个小于0的值pare(“ab”); //返回大于0的值pare(s); //相等pare(0,2,s,2,2); //用”ab”和”cd”进行比较小于零pare(1,2,”bcx”,2); //用”bc”和”bc”比较。
怎么样?功能够全的吧!什么?还不能满足你的胃口?好吧,那等着,后面有更个性化的比较算法。
先给个提示,使用的是STL的比较算法。
什么?对STL一窍不通?靠,你重修吧!2.5 更改内容这在字符串的操作中占了很大一部分。
首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至单一字符(如:s=’j’)。
还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。
还是举例说明吧:s.assign(str); //不说s.assign(str,1,3);//如果str是”iamangel”就是把”ama”赋给字符串s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给ss.assign(“gaint”); //不说s.assign(“nico”,5);//把’n’‘I’‘c’‘o’‘\0’赋给字符串s.assign(5,’x’);//把五个x赋给字符串把字符串清空的方法有三个:s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂!)。
string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。
先说增加字符(这里说的增加是在尾巴上),函数有 +=、append()、push_back()。
举例如下:s+=str;//加个字符串s+=”my name is jiayp”;//加个C字符串s+=’a’;//加个字符s.append(str);s.append(str,1,3);//不解释了同前面的函数参数assign的解释s.append(str,2,string::npos)//不解释了s.append(“my name is jiayp”);s.append(“nico”,5);s.append(5,’x’);字符串操作是一个不小的主题,在标准C++中,string字符串类成为一个标准,之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下的需要.C++ Strings(字符串)--------------------------------------------------------------------------------构造函数(Constructors)语法:string();string( size_type length, char ch );string( const char *str );string( const char *str, size_type length );string( string &str, size_type index, size_type length ); string( input_iterator start, input_iterator end );字符串的构造函数创建一个新字符串,包括:以length为长度的ch的拷贝(即length个ch)以str为初值(长度任意),以index为索引开始的子串,长度为length, 或者以从start到end的元素为初值.例如,string str1( 5, 'c' );string str2( "Now is the time..." );string str3( str2, 11, 4 );cout << str1 << endl;cout << str2 << endl;cout << str3 << endl;显示cccccNow is the time...time--------------------------------------------------------------------------------操作符(Operators)语法:==><>=<=!=++=[]你可以用==, >, <, >=, <=, and !=比较字符串. 可以用+ 或者+= 操作符连接两个字符串, 并且可以用[]获取特定的字符.相关主题:at(), compare().--------------------------------------------------------------------------------添加文本(append)语法:basic_string &append( const basic_string &str );basic_string &append( const char *str );basic_string &append( const basic_string &str, size_type index,size_type len );basic_string &append( const char *str, size_type num );basic_string &append( size_type num, char ch );basic_string &append( input_iterator start, input_iterator end );append() 函数可以完成以下工作:在字符串的末尾添加str,在字符串的末尾添加str的子串,子串以index索引开始,长度为len在字符串的末尾添加str中的num个字符,在字符串的末尾添加num个字符ch,在字符串的末尾添加以迭代器start和end表示的字符序列.例如以下代码:string str = "Hello World";str.append( 10, '!' );cout << str << endl;显示Hello World!!!!!!!!!!相关主题:+ 操作符--------------------------------------------------------------------------------赋值(assign)语法:basic_string &assign( const basic_string &str );basic_string &assign( const char *str );basic_string &assign( const char *str, size_type num );basic_string &assign( const basic_string &str, size_type index, size_type len );basic_string &assign( size_type num, char ch );函数以下列方式赋值:用str为字符串赋值,用str的开始num个字符为字符串赋值,用str的子串为字符串赋值,子串以index索引开始,长度为len用num个字符ch为字符串赋值.例如以下代码:string str1, str2 = "War and Peace";str1.assign( str2, 4, 3 );cout << str1 << endl;显示and--------------------------------------------------------------------------------at语法:reference at( size_type index );at()函数返回一个引用,指向在index位置的字符. 如果index不在字符串范围内, at() 将报告"out of range"错误,并抛出out_of_range异常。