c++_string类详解
C++的string类型中关于append函数、push_back函数和+=运算符的区别
![C++的string类型中关于append函数、push_back函数和+=运算符的区别](https://img.taocdn.com/s3/m/32532acc5ebfc77da26925c52cc58bd631869398.png)
C++的string类型中关于append函数、push_back函数和+=运算符的区别部分内容翻译⾃引⾔C++的string类中,要想在字符串后附加字符,可以使⽤append函数、push_back函数或者是+=运算符,这些附加字符的⽅法其实现不尽相同,因此应⽤场景也不同。
⾸先我们先⼀窥源码(gcc 4.9.2):basic_string.h://-------------------------------+=运算符重载部分---------------------------//追加 string 类型字符串basic_string&operator+=(const basic_string& __str){ return this->append(__str); }//追加 cstring 类型字符串basic_string&operator+=(const _CharT* __s){ return this->append(__s); }//追加单个字符basic_string&operator+=(_CharT __c){this->push_back(__c);return *this;}#if __cplusplus >= 201103L//追加字符类型的初始化列表basic_string&operator+=(initializer_list<_CharT> __l){ return this->append(__l.begin(), __l.size()); }//-------------------------------append函数实现部分---------------------------//追加 string 类型字符串basic_string&append(const basic_string& __str);//追加部分 string 类型字符串basic_string&append(const basic_string& __str, size_type __pos, size_type __n);//追加部分 cstring 类型字符串basic_string&append(const _CharT* __s, size_type __n);//追加 cstring 类型字符串basic_string&append(const _CharT* __s){__glibcxx_requires_string(__s);return this->append(__s, traits_type::length(__s));}//追加多个字符basic_string&append(size_type __n, _CharT __c);#if __cplusplus >= 201103L//追加字符类型的初始化列表basic_string&append(initializer_list<_CharT> __l){ return this->append(__l.begin(), __l.size()); }#endif // C++11template<class _InputIterator>template<class _InputIterator>basic_string& //附加给定范围内的多个字符append(_InputIterator __first, _InputIterator __last){ return this->replace(_M_iend(), _M_iend(), __first, __last); }//-------------------------------push_back函数实现部分---------------------------//追加单个字符voidpush_back(_CharT __c){const size_type __len = 1 + this->size();if (__len > this->capacity() || _M_rep()->_M_is_shared())this->reserve(__len);traits_type::assign(_M_data()[this->size()], __c);_M_rep()->_M_set_length_and_sharable(__len);}从以上源码的⾓度来分析append函数、push_back函数和+=运算符的不同使⽤场景,就⾮常直观了:+= 运算符:追加单个参数值。
C++string类成员函数c_str()的用法
![C++string类成员函数c_str()的用法](https://img.taocdn.com/s3/m/5fb361e6bb0d4a7302768e9951e79b896802683c.png)
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++课程设计之string字符串类
![C++课程设计之string字符串类](https://img.taocdn.com/s3/m/8a475f886529647d2728524a.png)
课程名称: C++程序设计课程代码:05题目: 字符串类的设计年级/专业/班: 软件工程2班学生姓名:学号:指导教师: 袁辉勇开题时间: 2011 年 5 月 15 日完成时间: 2011 年 6 月 5 日—湖南人文科技学院计算机系目录一引言 (3)二设计目的与任务 (3)三设计方案 (4)1 总体设计 (4)2 详细设计 (4)四程序清单 (4)五程序调试与体会 (10)六运行结果 (14)七结论................................................. 错误!未定义书签。
八参考文献............................................... 错误!未定义书签。
摘要本设计通过定义字符串类来实现对字符串的赋值、连接、复制、查找、交换操作。
首先定义一个字符串类,通过调用字符串类中成员函数,对字符串类进行赋值,然后实现了字符串类之间的连接,字符串类之间的相互复制,字符串类之间的交换,最后可以对该字符串类中的字符串进行查找。
关键字:字符串;类;成员函数;对象AbstractBy defining the design of this type of string to string to the realization of the assignment, to connect, copy, find, exchange operations. First of all, the definition of a type of string, by calling members of the String class function, the type of string for assignment, and then realized the connection between the type of string, string-type between the copy, between string-type In exchange, the last class to the string of string to find.Keywords: string; category; members of the function; object 。
string类型c语言
![string类型c语言](https://img.taocdn.com/s3/m/3dbdac132bf90242a8956bec0975f46527d3a7a3.png)
string类型c语言string类型是C语言中一种非常重要的数据类型,用于表示一串字符。
在C语言中,字符串是由字符数组组成的,每个字符都占用一个字节的空间。
字符串以'\0'(空字符)作为结尾,因此在使用字符串时需要注意字符串的长度。
在C语言中,我们可以使用一些函数来操作字符串。
例如,strlen()函数用于计算字符串的长度,strcpy()函数用于将一个字符串复制到另一个字符串,strcat()函数用于将一个字符串追加到另一个字符串的末尾,strcmp()函数用于比较两个字符串是否相等等等。
字符串类型在C语言中的应用非常广泛。
我们可以使用字符串类型来存储和处理各种文本数据,比如用户输入的姓名、地址、电话号码等。
此外,字符串类型还可以用来表示文件路径、URL地址等。
在使用字符串类型时,我们需要注意以下几点:1. 字符串的长度是有限的,需要确保存储字符串的字符数组足够大,以防止溢出。
2. 字符串是不可变的,一旦创建就不能修改。
如果需要修改字符串,可以先将其复制到一个新的字符数组中,然后进行修改。
3. 字符串操作函数可能会产生缓冲区溢出等安全问题,因此在使用这些函数时需要谨慎,确保输入的数据不会超出字符数组的长度。
除了以上注意事项,我们还可以通过一些方法来提高字符串的处理效率。
例如,可以使用指针来遍历字符串,而不是通过下标来访问字符数组中的每个元素。
此外,可以使用字符串处理函数来简化代码,提高代码的可读性和可维护性。
总结来说,字符串类型是C语言中非常重要的数据类型,广泛应用于各种文本数据的存储和处理。
在使用字符串类型时,我们需要注意字符串的长度和安全性,并且可以通过一些方法来提高字符串的处理效率。
希望本文对读者对字符串类型的理解和应用有所帮助。
VC++ CString详解
![VC++ CString详解](https://img.taocdn.com/s3/m/eedef747336c1eb91a375db7.png)
1、CString 对象的连接:用”+”2、格式化字符串:用CString 对象的Format()方法。
用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧。
*****CString s; s.Format(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L"%d", total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用Unicode 编码。
比如说,不要用sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。
我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )这个宏不仅可以用来解决Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 扫描表格寻找匹配项。
string的各种函数(系统学习)
![string的各种函数(系统学习)](https://img.taocdn.com/s3/m/2b0f346c26284b73f242336c1eb91a37f1113266.png)
string的各种函数(系统学习)1、按照⾯向对象的要求,可以把字符串看作⼀个对象,设计⼀个串类加以描述。
但是,在⼀般的情况下不必建⽴⾃⼰的串类,c++标准在库<string>中给出了类string,提供了丰富的串操作,程序员使⽤指令: #include<string>即存取这个类。
可将类string视为⼀个容器类,其部分操作如下:构造函数:string s:构造⼀个空串sstring s(a):构造串s,并⽤字符数组a初始化string s(a,n):构造串s,⽤字符数组a的前n个字符初始化string s(str):⽤串str构造串s(拷贝初始化)看下⾯代码验证#include<iostream>#include<string.h>#include<map>#include<cstdio>#include<cstring>#include<stdio.h>#include<cmath>#include<ctype.h>#include<math.h>#include<algorithm>#include<set>#include<queue>typedef long long ll;using namespace std;const ll mod=1e9+7;const int maxn=1e5+10;const int maxk=3e5+10;const int maxx=1e4+10;const ll maxe=1000+10;#define INF 0x3f3f3f3f3f3f#define Lson l,mid,rt<<1#define Rson mid+1,r,rt<<1|1int main(){char a[maxn];cin>>a;//输⼊abcdefghstring s(a);//结果为abcdefghstring s1(a,5);//结果为abcdestring s2(s1);//结果为abcdecout<<s<<endl;cout<<s1<<endl;cout<<s2<<endl;return0;}输⼊输出:getline(cin,s,delim):从cin中提取字符存⼊串s中,当遇到delim或者提取的字符个数等于s的长度时结束,如果⾃⼰不设定,默认为'\n' getline(cin,s):遇到'\n'结束cin>>s:遇到空⽩字符终⽌提取,空⽩字符不被读取cout<<s:输出s#include<iostream>#include<string.h>#include<map>#include<cstdio>#include<cstring>#include<stdio.h>#include<cmath>#include<ctype.h>#include<math.h>#include<algorithm>#include<set>#include<queue>typedef long long ll;using namespace std;const ll mod=1e9+7;const int maxn=1e5+10;const int maxk=3e5+10;const int maxx=1e4+10;const ll maxe=1000+10;#define INF 0x3f3f3f3f3f3f#define Lson l,mid,rt<<1#define Rson mid+1,r,rt<<1|1int main(){string s;while(getline(cin,s,'#')){getchar();//⾃⼰指定了字符要加getchar,不然结果会多出⼀个换⾏,但是默认情况下不⽤加getcharcout<<s<<endl;}return0;}操作符:s=val:赋值操作,val可以是⼀个串,⼀个字符或⼀个字符数组s+=val:将val添加到串s之后s[pos]:下标操作s+t,t+s:s和t的连接,返回连接的结果。
C++中string,wstring,CString常用方法
![C++中string,wstring,CString常用方法](https://img.taocdn.com/s3/m/6e132f100640be1e650e52ea551810a6f524c875.png)
C++中string,wstring,CString常⽤⽅法⼀.概念 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳⼊C++标准之中.wstring是操作宽字符串的类.C++标准程序库对于string的设计思维就是让他的⾏为尽可能像基本类型,不会在操作上引起什么⿇烦。
CString是对string(字符串)和wstring(宽字符串)的⼀个封装,常⽤在mfc中.⽤来解决编码问题的. string/wstring和CString在使⽤中,要根据实际环境选取。
CString是MFC⾥的,string是STL⾥的,后者通⽤性强些,前者功能全些。
⼀般在mfc中使⽤CString更为好⼀些。
⼆.常⽤⽅法string/wstring常⽤⽅法:string类的构造函数:string(const char *s); //⽤const字符串s初始化string(int n,char c); //⽤n个字符c初始化此外,string类还⽀持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。
当构造的string太长⽽⽆法表达时会抛出length_error异常;string类的字符操作:const char &operator[](int n)const;const char &at(int n)const;char &operator[](int n);char &at(int n);operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
const char *data()const;//返回⼀个⾮null终⽌的c字符数组const char *c_str()const;//返回⼀个以null终⽌的c字符串int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数⽬string的特性描述:int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)int max_size()const; //返回string对象中可存放的最⼤字符串的长度int size()const; //返回当前字符串的⼤⼩int length()const; //返回当前字符串的长度bool empty()const; //当前字符串是否为空void resize(int len,char c);//把字符串当前⼤⼩置为len,并⽤字符c填充不⾜的部分string类的输⼊输出操作:string类重载运算符operator>>⽤于输⼊,同样重载运算符operator<<⽤于输出操作。
c string类的常用方法
![c string类的常用方法](https://img.taocdn.com/s3/m/8e2d91b9900ef12d2af90242a8956bec0975a5a6.png)
c string类的常用方法在C语言中,字符串通常表示为字符数组,而不是像C++那样有专门的字符串类。
但C标准库中提供了一些用于操作和处理字符串的函数。
以下是其中的一些常用方法:1. strcpy():将一个字符串复制到另一个字符串。
```cchar str1[50];strcpy(str1, "Hello, World!");```2. strcat():将一个字符串连接到另一个字符串的末尾。
```cchar str1[50] = "Hello, ";strcat(str1, "World!");```3. strlen():返回字符串的长度,不包括终止字符'\0'。
```cchar str[] = "Hello, World!";printf("%d", strlen(str)); // 输出 13```4. strcmp():比较两个字符串。
```cchar str1[] = "Hello";char str2[] = "World";if (strcmp(str1, str2) < 0) {printf("%s is less than %s\n", str1, str2);} else if (strcmp(str1, str2) > 0) {printf("%s is greater than %s\n", str1, str2); } else {printf("%s is equal to %s\n", str1, str2);}```5. strstr():在字符串中查找子串。
```cchar str[] = "Hello, World!";char sub[] = "World";char result = strstr(str, sub);if (result != NULL) {printf("Found '%s' in '%s'\n", sub, str);} else {printf("Did not find '%s' in '%s'\n", sub, str); }```6. sprintf():将格式化的数据写入字符串。
C++中字符串的常见操作
![C++中字符串的常见操作](https://img.taocdn.com/s3/m/340643617ed5360cba1aa8114431b90d6c8589e9.png)
C++中字符串的常见操作字符串分割在⼀些⽐较流⾏的语⾔中,字符串分割是⼀个⽐较重要的⽅法,不论是在python,java这样的系统级语⾔还是js这样的前端脚本都会在⽤到字符串的分割,然⽽在c++中却没有这样的⽅法⽤来调⽤。
但是在boost中却提供分割⽅法。
使⽤vector实现下⾯是⽤vector实现的⼀个简单的split函数,借助string::find函数查找匹配⼦串的位置,然后截取剩下的字符串之后继续处理,实现对原字符串的完整处理。
vector<string> split(string &s, string &delim, bool removeEmpty = false, bool fullMatch = false) {vector<string> result;string::size_type start = 0, skip = 1;// 使⽤整个字符串进⾏查找,之后会直接跳过整个⼦字符串if (fullMatch) {skip = delim.length();}while (start != string::npos) {// 从start位置开始查找⼦字符串delim第⼀次出现的位置string::size_type finsh = s.find(delim, start);if (skip == 0) {finsh = string::npos;}// 从start开始到(finsh - start)处获得⼦字符串// 获得匹配字符串之前的字符串string token = s.substr(start, finsh - start);// 对token进⾏判断并决定是否移除空if (!(removeEmpty && token.empty())) {// 将匹配字符串之前的字符串放进向量中result.push_back(token);}// 判断此时是否到了原字符串的末尾if ((start = finsh) != string::npos) {// 将⼦字符串放进向量中,是为了保证原字符串的字符不丢失result.push_back(delim);// 将查找位置向前移动skip个位置start = start + skip;}}return result;}关于字符串的输⼊⽅法: std::cin , 多个单词使⽤函数std::getline(std::cin, s)这个函数接受两个参数:⼀个输⼊流对象和⼀个 string 对象。
c中string的用法
![c中string的用法](https://img.taocdn.com/s3/m/23e4c2bd294ac850ad02de80d4d8d15abe230011.png)
c中string的用法c中string的用法的用法你知道吗?下面小编就跟你们详细介绍下c中string的用法的用法,希望对你们有用。
c中string的用法的用法如下:为了在我们的程序中使用string类型,我们必须包含头文件<string>。
如下:#include <string> //注意这里不是string.h string.h是C字符串头文件#include <string>using namespace std;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++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
C++中的字符串类型
![C++中的字符串类型](https://img.taocdn.com/s3/m/6c040b2f915f804d2b16c1cb.png)
C++中的字符串类型1.字符(串)表示分类C++提供了两种字符串的表示形式,即C风格的字符串和标准字符串。
C++引入的是string 类类型,但实际上在许多程序的情形中我们有必要理解和使用老式的C 风格字符串。
总共包括以下几种类型:a.charb.wchar_tc.TCHARc.LPSTRd.LPCSTRe.LPTSTRf.LPCTSTRg.Cstringh.stringi.BSTR2.C风格字符串C 风格的字符串起源于C 语言并在C++中继续得到支持,实际上在标准C++之前除了第三方字符串库类之外它是惟一一种被支持的字符串。
字符串被存储在一个字符数组中,一般通过一个char*类型的指针来操纵它,标准C 库为操纵C 风格的字符串提供了一组函数例如:// 返回字符串的长度int strlen( const char* );// 比较两个字符串是否相等int strcmp( const char*, const char* );// 把第二个字符串拷贝到第一个字符串中char* strcpy(char*, const char* );标准C 库作为标准的C++的一部分被包含在其中为使用这些函数我们必须包含相关的C 头文件#include <cstring>指向C 风格字符串的字符指针总是指向一个相关联的字符数组,即使当我们写一个字符串常量时,如:const char *st = "The expense of spirit\n";系统在内部也把字符串常量存储在一个字符串数组中,然后st 指向该数组的第一个元素。
那么我们怎样以字符串的形式来操纵st 呢?一般地我们用指针的算术运算来遍历C 风格的字符串,每次指针增加1 直到到达终止空字符为止例如:while ( *st++ ) { ... }char*类型的指针被解除引用并且测试指向的字符是true 还是false 。
true 值是除了空字符外的任意字符(空字符在判断语句中被莫认为是假),++是增加运算符它使指针指向数组中的下一个字符。
c,,实验报告,用string类申明字符串对象实现数组的转置
![c,,实验报告,用string类申明字符串对象实现数组的转置](https://img.taocdn.com/s3/m/a4c48035492fb4daa58da0116c175f0e7cd119e5.png)
c,,实验报告,用string类申明字符串对象实现数组的转置C++程序设计实验报告C++实验报告实验一1. 实验要求(1)编写一个函数把华氏温度转换为摄氏温度,转换公式如下C=(F-32)*5/9(2)编写重载函数Max1可分别求两个整数,三个整数,两个双精度数,三个双精度数的最大值。
(3)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
(4)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程2. 实验内容及实验步骤(1)编写函数float Convert(float TempFer),参数和返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入、输出。
程序名:lab3_1.cpp。
(2)分别编写四个同名函数max1,实现函数重载,在main()函数中测试函数功能。
程序名:lab3_2.cpp(3)在main()函数中提示输入两个整数x、y,使用cin语句得到x、y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。
程序名:lab3_4.cpp(4)编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算Fibonacci级数。
公式为fib(n)=fib(n-1)+fib(n-2),n2;fib(1)=fib(2)=1。
使用if语句判断函数的出口,在程序中用cout语句输出提示信息。
程序名:(转载于: 写论文网:c,,实验报告,用string类申明字符串对象实现数组的转置)lab3_5.cpp(5)使用debug中的Step Into追踪到函数内部,观察函数的调用过程。
3.源程序Lab3_1#includeiostreamusing namespace std;float fun(float x){ float y;y=(x-32)*5/9;return y;}void main(){ float f,c;cout请输入华氏温度: ;cinf;c=fun(f);cout对应的摄氏温度为: cendl; }运行结果Lab3_2#includeiostreamusing namespace std;int Max1(int x,int y){ return (xy?x:y);}int Max1(int x,int y,int z){ int h,k;h=(xy?x:y);k=(hz?h:z);return k;}double Max1(double x,double y) {return (xy?x:y);}double Max1(double x,double y,double z) { double h,k;h=(xy?x:y);k=(hz?h:z);return k;}void main(){ int i,j,k;double l,m,n;cout请输入两个整数: ;cinij;cout最大数为: Max1(i,j)endl;cout请输入三个整数: ;cinijk;cout最大数为: Max1(i,j,k)endl;cout请输入两个双精度数: ;cinlm;cout最大数为: Max1(l,m)endl;cout请输入三个双精度数: ;cinlmn;cout最大数为: Max1(l,m,n)endl;}运行结果Lab3_3#includeiostream#includecmathusing namespace std; void main(){ double p,x,y;cinxy;p=pow(x,y);coutpendl;}运行结果Lab3_4#includeiostream.hint fib(int n);int main(){int n,answer;coutEnter number:endl; cinn;cout\n\n;answer=fib(n);coutansweris thenth Fibonacci number\nendl;return 0;}int fib(int n){coutProcessing fib(n)…endl;if(n3){coutReutrn 1!\n;return(1);}elsecoutCall fib(n-2)and fib(n-1).\nendl;return(fib(n-2)+fib(n-1));}运行结果4.实验体会其实这次实验涉及C++的内容并不多,主要练习的只是C++中的输入输出和重载函数的应用。
深入解析C++中的字符数组和处理字符串的方法
![深入解析C++中的字符数组和处理字符串的方法](https://img.taocdn.com/s3/m/24b567c1250c844769eae009581b6bd97f19bcb2.png)
深⼊解析C++中的字符数组和处理字符串的⽅法C++字符数组⽤来存放字符数据的数组是字符数组,字符数组中的⼀个元素存放⼀个字符。
字符数组具有数组的共同属性。
由于字符串应⽤⼴泛,C和C++专门为它提供了许多⽅便的⽤法和函数。
字符数组的定义和初始化定义字符数组的⽅法与前⾯介绍的类似。
例如:char c[10];c[0]=′I′;c[1]=′′;c[2]=′a′;c[3]=′m′;c[4]=′′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′;上⾯定义了c为字符数组,包含10个元素。
在赋值以后数组的状态如图所⽰。
对字符数组进⾏初始化,最容易理解的⽅式是逐个字符赋给数组中各元素。
如char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};把10个字符分别赋给c[0]~c[9]这10个元素。
如果花括号中提供的初值个数⼤于数组长度,则按语法错误处理。
如果初值个数⼩于数组长度,则只将这些字符赋给数组中前⾯那些元素,其余的元素⾃动定为空字符。
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会⾃动根据初值个数确定数组长度。
如:char c[]={'I',' ','a','m',' ','h','a','p','p','y'};也可以定义和初始化⼀个⼆维字符数组,如复制代码代码如下:char diamond[5][5]={{' ',' ','*'},{' ', '*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};字符数组的赋值与引⽤只能对字符数组的元素赋值,⽽不能⽤赋值语句对整个数组赋值。
MFC、C++、C中字符类型CString int string char知识
![MFC、C++、C中字符类型CString int string char知识](https://img.taocdn.com/s3/m/bae00aef5ef7ba0d4a733b71.png)
MFC/C++/C中字符类型CString, int, string, char*转换(转)参考网址:/s/blog_50a0aa5e0100dntj.html1 CString,int,string,char*之间的转换string 转CString例子:CString.format("%s", string.c_str());char 转CString例子:CString.format("%s", char*);char 转string例子:string s(char *);string 转char *例子:char *p = string.c_str();// CString转std::stringCString str = dlg.GetPathName();setlocale(LC_ALL, "chs");char *p = new char[256];wcstombs ( p, str, 256 );m_fileName = p;1,string -> CStringCString.format("%s", string.c_str());用c_str()确实比data()要好.2,char -> stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign().3,CString -> stringstring s(CString.GetBuffer());GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. 《C++标准函数库》中说的有三个函数可以将字符串的内容转换为字符数组和C—string1.data(),返回没有”\0“的字符串数组2,c_str(),返回有”\0“的字符串数组3,copy()CString互转int 将字符转换为整数,可以使用atoi、_atoi64或atol。
C++的String类及其成员函数和智能指针专题
![C++的String类及其成员函数和智能指针专题](https://img.taocdn.com/s3/m/c22fafc30c22590102029d2a.png)
本文作者:黄邦勇帅本文是学习C++的附加内容,主要介绍了C++中的string类的各种成员函数,及成员函数的功能与作用,是作为学习C++的参考使用的。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。
声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。
主要参考文献:1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月3、C++.Primer.Plus.第三版.中文版Stanley B.Lippman等著潘爱民张丽译中国电力出版社2002年5月4、C++入门经典第三版[美]Ivor Horton著李予敏译清华大学出版社2006年1月5、C++参考大全第四版[美]Herbert Schidt著周志荣朱德芳于秀山等译电子工业出版社2003年9月6、21天学通第四版C++ [美]Jesse Liberty著康博创作室译人民邮电出版社2002年3月第20章string类1、string类用于处理字符串,要使用string类需要包含string头文件。
2、注意string是一个类,它具有类的特性,也就是说string类有构造函数,有重载的操作符,有成员函数。
string对象可以自动调整大小,但有一些限制,string对象有个最大允许的长度,该长度由string类的静态常量string::nops设定,通常是最大的unsigned int值,在vc++中被设为-1。
3、string类是模板类basic_string类的char具体化版本,basic_string类的原型为:template<class charT, classtraits=char_traits<charT>, class Allocator=allocator<charT> > class basic_string{….}; 对于string类具有预定义的具体化版本typedef basic_string<char> string;也就是说string是basic_string模板类的char具体化版本的别名。
c 有string类型的基础知识选择题
![c 有string类型的基础知识选择题](https://img.taocdn.com/s3/m/980ec58c88eb172ded630b1c59eef8c75fbf953e.png)
c 有string类型的基础知识选择题全文共四篇示例,供读者参考第一篇示例:在C语言中,虽然没有内置的string类型,但我们可以使用字符数组来表示字符串。
下面是一些关于C语言中string类型基础知识的选择题:1. 在C语言中表示字符串的最常见方法是使用什么数据类型?A. intB. floatC. charD. double答案:C2. 下面哪种声明方式可以正确定义一个字符数组来存储字符串"Hello"?A. char str[6] = "Hello";B. char str[5] = "Hello";C. char str[] = "Hello";D. char str[5] = {'H', 'e', 'l', 'l', 'o'};4. 下面哪个函数用于计算字符串的长度?A. strlen()B. strcpy()C. strcat()D. strcmp()9. 字符串"Hello World"的长度是多少?A. 10B. 11C. 12D. 13第二篇示例:1. 在C语言中,字符串类型是以哪种方式进行表示的?A. 数组B. 结构体C. 指针D. 链表2. 下列哪种数据类型用于表示字符串的结尾?A. charB. intC. floatD. null4. 下列哪个函数用于比较两个字符串是否相等?A. strlen()B. strcpy()C. strcmp()D. strcat()11. 在C语言中,如何声明一个字符串变量?A. char str;B. char *str[];C. char str[];D. char *str;12. 下列哪个语句用于初始化一个字符串变量?A. str = "hello";B. strcpy(str, "hello");C. str = {'h', 'e', 'l', 'l', 'o', '\0'};D. str = "hello\0";15. 在C语言中,如何将一个整数转换为字符串?A. itoa()B. atoi()C. atof()D. sprintf()答案:1. A2. D3. D4. C5. A6. B7. D8. D9. D10. A11. D12. B13. A14. A15. D希望以上选择题能帮助大家更好地了解C语言中关于字符串类型的基础知识。
C++string.erase()用法详解
![C++string.erase()用法详解](https://img.taocdn.com/s3/m/1b3452d5ab00b52acfc789eb172ded630a1c985f.png)
C++string.erase()⽤法详解标准库类型string表⽰可变长的字符序列。
可以通过string类的erase()函数来对该字符序列进⾏删除操作。
erase()函数共有3种格式,分别⽤来删除指定位置的字符、删除指定长度的字符串和删除指定范围的字符串。
1、string.erase(pos,n) //删除从pos开始的n个字符 string.erase(0,1); 删除第⼀个字符#include <string>#include <iostream>using namespace std;int main(){string::iterator i;string s;cin>>s;s.erase(1,2);cout<<s;return 0;}2、string.erase(pos) //删除pos处的⼀个字符(pos是string类型的迭代器)#include <string>#include <iostream>using namespace std;int main(){string::iterator i;string s;cin>>s;i = s.begin()+3;s.erase(i);cout<<s;return 0;}3、string.erase(first,last) //删除从first到last中间的字符(first和last都是string类型的迭代器)#include <string>#include <iostream>using namespace std;int main(){string::iterator i;string s;cin>>s;s.erase(s.begin()+1,s.end()-1);cout<<s;return 0;}到此这篇关于C++ string.erase()⽤法详解的⽂章就介绍到这了,更多相关C++ string.erase()⽤法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
CC++编程判断String字符串是否包含某个字符串实现示例
![CC++编程判断String字符串是否包含某个字符串实现示例](https://img.taocdn.com/s3/m/148ec80db6360b4c2e3f5727a5e9856a561226dc.png)
CC++编程判断String字符串是否包含某个字符串实现⽰例⽬录⼀、C语⾔风格⼆、C++风格⼀、C语⾔风格在C语⾔中,字符串存储为字符数组,以'\0'结束。
在C的接⼝中,有strstr函数,可以在字符串中查找另⼀个字符串。
char * strstr(const char *str1, const char *str2);功能为在str1中查找str2,如果存在,那么返回查找到的起始指针,否则返回NULL。
参考代码:#include <iostream>#include <string>#include <cstring>using namespace std;int main(){string a= "abcdefghigklmn" ;char *b= "def" ;char *c= "123" ;if ( strstr (a.c_str(), b) == NULL) //在a中查找b,如果不存在,cout << "not found\n" ; //输出结果。
else //否则存在。
cout << "found\n" ; //输出结果。
if ( strstr (a.c_str(), c) == NULL) //在a中查找b,如果不存在,cout << "not found\n" ; //输出结果。
else //否则存在。
cout << "found\n" ; //输出结果。
return 0;}⼆、C++风格C++的string类提供了字符串中查找另⼀个字符串的函数find。
其重载形式为:string::size_type string::find(string &);功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++中针对C语言中处理字符串的难题,在标准库中设计了string类,因此现在编程中涉及到字符串的处理,就可以直接使用string类了。
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。
我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。
我们尽可以把它看成是C++的基本数据类型。
首先,为了在我们的程序中使用string类型,我们必须包含头文件。
如下:#include <string>//注意这里不是string.h string.h是C字符串头文件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异常。