C/C++学习条记:string 字符串
在 C++ 中,字符串的科罚是一项基本且进军的任务,岂论是缔造粗略的应用智商照旧复杂的软件系统,齐离不开字符串的应用。C++ 提供了两种科罚字符串的神志:C 作风的字符串和 C++ 作风的字符串。C 作风的字符串实质上是一个以空字符\0罢了的字符数组,而 C++ 作风的字符串则是通过 string 类已矣的,后者提供了更宽广和肤浅的功能,使得字符串操作愈加高效和安全。本文将深远研究 C++ 中 string 类的使用递次偏抓提供的各式功能。
界说与开动化
使用 string 类需要包含头文献<string>,底下的例子先容了几种界说 string 变量(对象)的递次:#include<iostream>#include<string>usingnamespacestd;intmain(){string s1;string s2 = "c plus plus";string s3 = s2;strings4(5, 's');return;}变量 s1 仅仅界说但莫得开动化,编译器会将默许值赋给 s1,默许值是"",也即空字符串。变量 s2 在界说的同期被开动化为"c plus plus"。与 C 作风的字符串不同,string 的罢了莫得浪漫标记'\0'。变量 s3 在界说的本领径直用 s2 进行开动化,因此 s3 的内容亦然"c plus plus"。变量 s4 被开动化为由 5 个's'字符构成的字符串,也便是"sssss"。从上头的代码不错看出,string 变量不错径直通过赋值操作符=进行赋值。string 变量也不错用 C 作风的字符串进行赋值,举例,s2 是用一个字符串常量进行开动化的,而 s3 则是通过 s2 变量进行开动化的。与 C 作风的字符串不同,当咱们需要知谈字符串长度时,不错调用 string 类提供的 length() 函数。如下所示:string s = "Hello world!";int len = s.length();cout<<len<<endl;输出效果为12。由于 string 的末尾莫得'\0'字符,是以 length() 复返的是字符串的真正长度,而不是长度 +1。
鼎新为 C 作风的字符串
天然 C++ 提供了 string 类来替代 C 讲话中的字符串,然而在施行编程中,有本领必须要使用 C 作风的字符串(举例绽放文献时的旅途),为此,string 类为咱们提供了一个鼎新函数 c_str(),该函数大约将 string 字符串鼎新为 C 作风的字符串,并复返该字符串的 const 指针(const char*)。请看底下的代码:string path = "E:\\demo.txt";FILE *fp = fopen(path.c_str(), "rt");为了使用 C 讲话中的 fopen() 函数绽放文献,必须将 string 字符串鼎新为 C 作风的字符串。
字符串的输入输出
string 类重载了输入输出运算符,不错像对待世俗变量那样对待 string 变量,也便是用>>进行输入,用<<进行输出。请看底下的代码:#include<iostream>#include<string>usingnamespacestd;intmain(){string s;cin>>s; //输入字符串cout<<s<<endl; //输出字符串return;}运行效果:abc def↙abc天然咱们输入了两个由空格离隔的网址,然而只输出了一个,这是因为输入运算符>>默许会忽略空格,遭受空格就以为输入浪漫,是以终末输入的 "def" 莫得被存储到变量 s。
造访和修改字符串中的字符
string 字符串也不错像 C 作风的字符串不异按照下标来造访其中的每一个字符。string 字符串的肇始下标已经从 0 入手。请看底下的代码:#include<iostream>#include<string>usingnamespacestd;intmain(){string s = "1234567890";for(int i=,len=s.length(); i<len; i++){cout<<s[i]<<" "; }cout<<endl; s[5] = '5'; s.at(6) = '5'; cout<<s<<endl;return;}运行效果:1 2 3 4 5 6 7 8 9 01234555890本例界说了一个 string 变量 s,并赋值 "1234567890",之后用 for 轮回遍历输出每一个字符。借助下标运算符[]或at()递次,除了大约造访每个字符,也不错修改每个字符。s[5] = '5';将第 6 个字符修改为 '5', s.at(6) = '5';将第 7 个字符修改为 '5', 是以 s 终末为 "1234555890"。需要考究的是,at() 递次在索引超出规模时会抛出颠倒,而 [] 则不会进行规模查验,因此,在不祥情索引是否有用时,保举使用 at()。
字符串的拼接
有了 string 类,咱们不错使用+或+=运算符来径直拼接字符串,相当方便,再也不需要使用 C 讲话中的 strcat()、strcpy()、malloc() 等函数来拼接字符串了,再也无谓驰念空间不够会溢出了。用+来拼接字符串时,运算符的双方不错齐是 string 字符串,也不错是一个 string 字符串和一个 C 作风的字符串,还不错是一个 string 字符串和一个字符数组,或者是一个 string 字符串和一个单独的字符。请看底下的例子:#include<iostream>#include<string>usingnamespacestd;intmain(){string s1 = "first ";string s2 = "second ";char *s3 = "third ";char s4[] = "fourth ";char ch = '@';string s5 = s1 + s2;string s6 = s1 + s3;string s7 = s1 + s4;string s8 = s1 + ch;cout<<s5<<endl<<s6<<endl<<s7<<endl<<s8<<endl;return;}运行效果:first secondfirst thirdfirst fourthfirst @
字符串的增改换查
C++ 提供的 string 类包含了多少实用的成员函数,大大方便了字符串的加多、删除、更变、查询等操作。
(1)插入字符串
insert() 函数不错在 string 字符串中指定的位置插入另一个字符串,它的一种原型为:string& insert(size_t pos, conststring& str);pos 默示要插入的位置,也便是下标;str 默示要插入的字符串,它不错是 string 字符串,也不错是 C 作风的字符串。泉源:fangchenggang.sfangba.com泉源:laibin.sfangba.com泉源:kaiping.sfangba.com泉源:huidong.sfangba.com泉源:yangchun.sfangba.com泉源:taishan.sfangba.com泉源:chaozhou.sfangba.com泉源:shaoguan.sfangba.com泉源:yangjiang.sfangba.com泉源:qingyuan.sfangba.com泉源:meizhou.sfangba.com泉源:zhaoqing.sfangba.com泉源:zhanjiang.sfangba.com泉源:jiangmen.sfangba.com泉源:zhongshan.sfangba.com泉源:dongguan.sfangba.com泉源:guangzhou.sfangba.com请看底下的代码:#include<iostream>#include<string>usingnamespacestd;intmain(){string s1, s2, s3; s1 = s2 = "1234567890"; s3 = "aaa"; s1.insert(5, s3);cout<< s1 <<endl; s2.insert(5, "bbb");cout<< s2 <<endl;return;}运行效果:12345aaa6789012345bbb67890insert() 函数的第一个参数有越界的可能,如若越界,则会产生运行时颠倒。
(2) 删除字符串
erase() 函数不错删除 string 中的一个子字符串。它的一种原型为:string& erase(size_t pos = , size_t len = npos);pos 默示要删除的子字符串的肇始下标,len 默示要删除子字符串的长度。如若不指明 len 的话,那么径直删除从 pos 到字符串浪漫处的总共字符(此时 len = str.length - pos)。代码:#include<iostream>#include<string>usingnamespacestd;intmain(){string s1, s2, s3; s1 = s2 = s3 = "1234567890"; s2.erase(5); s3.erase(5, 3);cout<< s1 <<endl;cout<< s2 <<endl;cout<< s3 <<endl;return;}运行效果:1234567890123451234590不需要驰念 len 参数过大导致要删除的子字符串越界的情况,待删除字符串最多只可删除到字符串罢了。