C++字符串处理

此博客为我对网上相关资料的总结,以方便自己后续查阅。

〇、字符串定义和初始化
    string s; //生成一个空字符串s
	s="string"; // 将s初始化为一个字符串字面值
	char char s[10]="string";
	string s1(s); //string s(str);拷贝构造函数生成str的复制品
	string s2(s,3); // string s(str, stridx);将字符串str内"始于位置stridx"的部分当作字符串的初值 
	string s3(s,3,2);  /* string s(str, stridx, strlen) ; 将字符串str内"始于stridx且长度顶多
	                        strlen"的部分作为字符串的初值*/
	string s4(chars,5); //string s(chars, chars_len) ;将C字符串前chars_len个字符作为字符串s的初值。
	string s5(chars,3,3);  /* string s(str, stridx, strlen) ; 将字C字符串chars内"始于stridx且长度顶多
	                                          strlen"的部分作为字符串的初值*/
    string s6(10,'s'); // string s(num, ‘c’) ;  生成一个字符串,包含num个c字符 
    string s7("Sunday"); // 将s初始化为一个字符串字面值副本
    string s8(s.begin(),s.end()-1);  // string s(begin, end);以区间begin/end(不包含end)内的字符作为字符串s的初值
	cout<<s<<' '<<s1<<' '<<s2<<' '<<s3<<' '<<s4<<' '<<s5<<endl;
	cout<<s6<<' '<<s7<<' '<<s8<<endl;

运行结果:
在这里插入图片描述

一、字符串输入
1.cin>>
 cin会从流中取数据,遇到空格或者换行符都会停止
2.getline()

(1)getline() 接受一个字符串,可以接收空格
(2)getline可以指定第三项参数,即遇到特定的字符停止,默认 是‘\n’,可以手动写成如‘,’.在遇到终结符后,终结符会被丢弃,不存入字符串中。在下次读入操作时,将在终结符的下个字符开始读入。

    string s,s1,s2;
	cin>>s;//遇空格、回车、Tab结束 
	getline(cin,s1);//按回车键结束输入
	getline(cin,s2,'#');//输入一串字符(不管多少个回车键),只要是在‘#’号之前的字符都会读取并保存
	
	cout<<"s:"<<s<<endl;
	cout<<"s1:"<<s1<<endl;
	cout<<"s2:"<<s2<<endl;

运行结果
在这里插入图片描述
观察结果里的s1发现Tuesday前有一个空格,这是因为cin碰到空格停止读取后,缓存区里剩余了一个空格。为此可以加一个getchar()吸收多余的字符,对换行符也是如此,需要先将缓存里的换行符吸收掉,否则会赋值为空串,这里需要特别注意。

3.cin.get()
 cin.get()可以给字符和字符数组赋值
    char s;
	char c[10];
    s=cin.get(); //如果cin.get()任何参数,默认从缓存区读一个字符
	cin.get(c,10); //第一项填数据名,第二项填其长度,就可以给特定字符变量输入字符串
    cout<<s<<endl<<c<<endl;

在这里插入图片描述
注意到给字符数组赋值时字符数组末尾自动加‘\0’,所以实际读取的字符长度比参数少一。


4.cin.getline()
 cin.getline()实际有三个参数,cin.getline(字符数组名,接受个数num,结束字符),当第三个参数省略时,系统默认为'\0'。输入过程中达到num个数或者提前遇到结束字符,输入结束。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
    char str[10];
    char str1[5];
	cin.getline(str1,4);
    cin.getline(str,5);
    cout<<str1<<endl;
    cout<<str<<endl;

运行结果:
在这里插入图片描述
可见str没有被输入。

5.gets()

gets()可以给字符数组赋值,遇换行符’\n’结束(然后将换行符丢掉,下次读将从换行符下个字符读取),如果使用gets()前有换行符要用 getchar()吸收换行符。

    int a;
	cin>>a;
	cout<<a<<endl;
	getchar(); //吸收分隔符
    char s[8];
    gets(s);
    puts(s);

在这里插入图片描述

二、字符串分割

string substr(size_t pos=0,size_t n=npos)const;
功能:获取子字符串
参数说明:pos为起始位置,n为长度。

三、字符串查找

size_t find(const string& str,size_t pos=0)const;
参数说明:str为子串,pos为初始查找位置。
功能:查找子字符串第一次出现的位置,否则返回string::npos。

四、字符串删改

1.append(string)将string拼接到字符串末尾,可以直接用+=。
2.insert(pos,string)在pos位置前插入string。
insert(it,it1,it2)将迭代器[it1,it2)之间的字符插入到迭代器it位置前。
3.erase(it)删除迭代器it位置的字符
erase(it1,it2)将迭代器[it1,it2)之间的子串删除。
erase(pos,len)将从位置pos开始的len个字符删除.
4.replace(pos,len,str)将pos位置开始,len长度的子串替换为str.
replace(it1,it2,str)将迭代器[it1,it2)之间的子串替换为str.
5.clear()清空字符串

*五、string、char*、const char*、char[]之间的转换
1.string->const char*
    string str="hello";
	const char *s=str.c_str();
2.const char*->char *
    const char *s="hello";
	char *a=const_cast<char*>(s);
3.char *、const char *->string

直接赋值

    const char *s="hello";
	char *a="world";
	string str=s;
	string str1=a;
4.char*->const char*

直接赋值

    const char *s;
	char *a="world";
	s=a;
5.string->char[]
    char b[20];
	string str="first";
	strcpy(b,str.c_str());
6.char[]->string,char ,const char

直接赋值

六、string转化为其他类型
1.sscanf(),sprintf()

初看sscanf,sprintf和scnaf,printf很像,scanf,printf是从输入设备将值输入到指定变量,将变量值输出到输出设备;sscanf,sprintf是从字符串中读取值到指定变量,将变量值输出到字符串中。sscanf,sprintf可用于字符数组与其他类型变量的转化。

    int a;
	float b;
	char s[10];
	char c[20]="20:saturday 3.14";
	sscanf(c,"%d:%s %f",&a,&s,&b);//数据从左往右传递 
	printf("%d %s %.2f\n",a,s,b);
	sprintf(c,"%s%d",s,a);//数据从右往左传递 	
	printf("%s\n",c);

运行结果
在这里插入图片描述

2.stringstream

<sstream>定义了三个类:istringstream,ostringstream,stringstream,分别用来进行流的输入、输出和输入输出。

	stringstream stream;
    int a=100;double b=3.14;
    string str;
    stream<<a<<b;
    stream>>str;
	cout<<str<<endl;
	stream.clear();//在进行多次类型转换时必须用clear()清空流。如果是单类型转换也可用stream.str("").
	bool c=false;
	stream<<c;
	stream>>str;
	cout<<str<<endl;

在这里插入图片描述

stream.str()返回流中数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值