C++字符串学习笔记

目录

一、字符串的创建

1.C语言字符数组的创建

2.C++字符串的创建

(1)声明

(2)初始化

二、读取与输出

2.1 getline()函数

2.2 cin

三、字符串的查询、增删

3.1 size() & length()

3.2 迭代器iterator

3.3 empty() 

3.4 find() & substr() 

3.5 clear() & erase()

 3.6 append() & insert()


一、字符串的创建

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"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值