目录
一、字符串的创建
1.C语言字符数组的创建
C语言中没有定义string类型,使用char[]数组,该方法在C++中仍可使用。
char str1[] = "string"; //方法一
char str2[] = {'s','t','r','i','n','g','\0'}; //方法二
char str3[100]; //未定义元素内容,仅声明其容量
char str4[100] = {"hello world"}; //从str4[0]开始定义部分元素,其余元素空间仍为空
方法一定义了一个char类型的数组str1,数组名所代表的指针指向首个元素,即str1 = &str1[0]。在这一过程中,编译器将字符串常量理解为字符串中首个字符的地址,并将该字符串中的每个字符在内存中连续排放,当我们创建字符数组的时候,数组名将发挥类似指针的功能,指向首元素的地址。同样的,我们也可使用指针完成该操作。
char str[] = {"work"}; //略
char *s; //定义一个指向char类型元素的指针
s = "string"; //通过这种方式,该指针同样也可以指向字符串
s = str; //字符数组名可将地址传给指针,该过程不可逆
str = s; //错误
此外,使用该方法时不必标识'\0',编译器会自动在数组末位添加'\0'以表示字符串的结束。
方法二中依次输入字符,但输入的字符中不能包含空格字符' ';此外,使用该方法创建字符数组时,结尾必须添加'\0',不可省略。
2.C++字符串的创建
C++中提供了string类以便创建和操作数组,使用前需要导入string标准库
#include<string>
(1)声明
string mystr; //创建名为mystr的字符串
string str1[10]; //创建长度为10个字符的字符串
(2)初始化
string s; //默认初始化,字符串为空
string s1 = "a"; //拷贝初始化
string str = string(4,'a'); //拷贝初始化,str="aaaa"
string s2 = s1; //创建s1的副本
string s3(s1); //创建s1的副本
string s4(5,'b'); //初始化,s4="bbbbb"
//使用c_str初始化C++字符串
char s5[] = {"Hello"}:
string s6 = string(s5,5); //使用数组s5中的第5个字符元素为s6初始化
二、读取与输出
/* 读取操作 */
string str = "name";
cout << str << endl;
和C语言中的字符数组一样,C++中的字符串也可以使用数组读取的格式读取特定位置的字符。此外,C++中还可以调用at()函数实现该功能。不同的是,当索引越界的时候,operate[]没有越界检查,不会报错并将输出随机字符,而at()将报错并跳出执行。
string str = "name";
cout << str.at(4) << endl; //输出:e
cout << str[4] << endl; //输出:e
C++中接收输入的字符串通常使用标准输入流cin和getline()函数。
2.1 getline()函数
getline()函数不会忽略位于字符串前和处于字符串中的空格,这是其相对于cin最显著的差别之一。
C++函数库istream和string中均定义了getline()函数,在istream库中该函数有两种重载形式:
istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
————————————————
引自CSDN博主「向心以履」的文章
原文链接:https://blog.csdn.net/qq_34622997/article/details/103172704
形式一的函数表示读取一行输入,敲击空格键将读取空字符并继续读取,直到读取的字符数目达到输入的n(包括结束标记符)或遇到回车换行键为止。
形式二的函数表示读取一行输入,敲击空格键将读取空字符并继续读取,直到读取的字符数目达到输入的n(包括结束标记符)或遇到回车换行键或遇到字符delim为止,字符delim不会被录入。
using namespace std;
//最多输入99个字符长度的字符串,当检测到截断字符s或回车换行符'\0'时停止输入
char str[100];
char sign = 's';
cin.getline(str,99,sign)
在string库中也定义了getline()函数,其使用方法与istream库中的略有不同。其在库中的定义如下:
istream& getline(istream& is, string& str, char delim);
istream& getline(istream&& is, string& str, char delim);
istream& getline(istream& is, string& str);
istream& getline(istream&& is, string& str);
————————————————
引自CSDN博主「向心以履」的文章
原文链接:https://blog.csdn.net/qq_34622997/article/details/103172704
该函数中的is代表一种输入流,常使用cin。在使用时该函数将输入流存储至字符串str中,直到遇到函数定界符delim或回车换行符'\0'为止。
需要注意的是该函数具有返回值,其返回值由输入流的状态决定:
- 当且仅当检测到EOF(end-of-file)事件发生时,返回值判定为FALSE,
- 当检测到delim或'\0'时,返回值判定为TRUE
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
cout << "You can use EOF to stop the program...";
while(getline(cin,str,'x'){
if(
2.2 cin
cin从首次检测到非' '和换行符,制表符时开始读取信息,当遇到下一个' '和换行符,制表符时结束。作为标准输入流,cin在状态为good的时候将会被隐式转换类型为Boolean类型中的TRUE,当且仅当遇到EOF事件或无效输入(如类型错误等,但检测到空格键不属于该范畴,cin将跳过此次输入并返回TRUE)时才会返回FALSE。
#include<iostream>
#include<string>
using namespace std;
//从该代码中我们可以看出,cin每完成一次有效输入返回一次true
int main(){
char temp;
string str;
while(cin >>temp){
str += temp;
cout << str << endl;
}
}
三、字符串的查询、增删
3.1 size() & length()
size()与length()函数均可用于获取字符串的长度,二者使用方法和效果相同。
string s = "name";
int i = s.size(); //i=4
int j = s.length(); //j=4
3.2 迭代器iterator
迭代器常用于字符串的遍历等操作,使用方法如下:
int main(){
string s = "answer";
string::iterator i = s.begin(); //i即为迭代器,该段代码声明了它的类型
for(;i!=s.end();++i){ //注意不要写成i<s.end()
cout << *i << endl; //使用了*的重载函数引用迭代器i所指的元素的值
}
return;
}
其中++operator函数有多个重载,当我们对链表,数组,字符串等数据结构进行操作时,不必考虑如何跳转至下一元素,其使用方法均相同。
s.end()迭代器指向字符串末尾的'\0'。
3.3 empty()
empty()函数可用于检测字符串是否为空。其返回值为布尔类型,若字符串为空则返回TRUE否则返回FALSE。
void a_printer(string s){
if(!s.empty())
cout << s << endl;
return;
}
3.4 find() & substr()
find()函数用于查找字符串中是否存在特定的子串,其返回值为int类型。若存在则将返回首次匹配到的子串的首个字符的索引,若未找到则返回-1,此处也可认为返回值为一个在库中预先定义好的常量string::npos,表示不存在的位置。
string s = "newspapers";
char c = 'p';
string ss = "er";
int pos1 = s.find(c); // pos1 = 4
int pos2 = s.find(ss); // pos2 = 7
int pos3 = s.find("emo"); // pos3 = -1
if(pos3 == string::npos)
cout << "Hello world"; //该段代码将会执行
substr()函数用于从指定位置和范围截取字符串中的子串,其返回值类型为子串的字符串对象。
s.substr(int pos=0,int len=s.size()-pos)中有两个参数,其中bpos标明子串的起始位置,len标明子串中所包含的字符数。这两个参数均有其默认值,pos默认值为0,len默认值为s.size()-pos。
string s = "newspapers";
string ss1 = s.substr(4,5); // ss1 = "paper"
string ss2 = s.substr(); // ss2 = "newspapers"
string ss3 = s.substr(4,string::npos); // ss3 = "papers"
3.5 clear() & erase()
clear()函数用于清空字符串。
string s = "Hello";
s.clear();
cout << s; //将输出""
erase()用于对字符串中特定位置的字符进行删除操作,有多种重载形式,功能丰富。
erase(pos, n); //删除从pos开始的n个字符,比如erase(0, 1)就是删除第一个字符 erase(position); //删除从position处的一个字符(position是个string类型的迭代器) erase(first, last); //删除从first到last之间的字符(first和last都是迭代器) string str ("This is an example phrase."); string::iterator it; // 第(1)种用法 str.erase (10,8); cout << str << endl; // "This is an phrase." // 第(2)种用法 it=str.begin()+9; str.erase (it); cout << str << endl; // "This is a phrase." // 第(3)种用法 str.erase (str.begin()+5, str.end()-7); cout << str << endl; // "This phrase." ———————————————— 转载自知乎文章《C++的string库用法总结》 原文链接:https://zhuanlan.zhihu.com/p/388823262
3.6 append() & insert()
append()函数是一个无返回值的函数,用于在字符串末端添加字符或字符串,功能类似于+=。
string str = "Hello ";
string answer;
cout << "Please enter your name: ";
cin >> answer;
cout << endl;
str.append(answer); //也可使用 str += answer;
cout << str;
insert()用于在指定位置插入字符的函数。其函数定义如下:
insert(size_type index,size_type count,char c);
insert()函数有三个参数,表示在字符串的第index个位置插入count个字符c。
string str = "abcde";
string s = "LL";
char c = 'a';
str.insert(2,1,s); //错误,s是字符串,类型错误
str.insert(2,1,c); //正确,str = "abacde"