C++ String的一些用法和相关例子

string是C++标准库的一个重要的部分,主要用于字符串处理。C++的算法库对string也有着很好的支持而且string还和c语言的字符串之间有着良好的接口。相比C语言的字符串C++字符串库函数更加强大,很多代码不需要自己写,可以直接调用库函数来实现。

申明以及初始化:

1、申明:

string s;//声明一个string对象
string strs[10];//声明一个string数组对象


初始化一般分为两种直接初始化和拷贝初始化,拷贝初始化一般使用等号。初始化可以在申明string对象的时候实现,如string s(?);括号里面的问号可以用一个
已知字符串替换如:“asdfdf”,也可以用某个已经定义的string对象替换。C++比较两个字符串是否相等,直接用==就可以了,下面看具体代码:


#include<iostream>
#include<string> 
using namespace std;

    string str1("wdbbjknf");//str1是字面值“wdbbjknf”的副本
      
    string str2(str1);//str2是str1的副本,wdbbjknf 
		
    string str3 = str2;//str3是str2的副本 ,wdbbjknf 
    
	//string str(n,'c'); 把str初始化为n个c字符的字符串 
    string str4(10,'c');//把str4初始化,把str4初始化为10个c字符,当然里面可以用其他数和字符代替 
    
    string str5="jhgfdsxc";//拷贝初始化,jhgfdsxc
    
    string str6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给str6,相当于先把string(10,‘c’)
								//初始化好了以后再拷贝给 str6 
	//string str7(str,n);从字符串str的第n个下标开始拷贝给str7,直到字符串结束,n不能超过str的size							
    string str7(str5,2);//从str5的第二个字符开始拷贝
    
    //string str8(str,n,m);从字符串str的第n个下标开始拷贝m个字符给str7,n不能超过str的size
    string str8(str5,3,4);//str8是str5从下标3开始4个字符的拷贝,超过str5.size出现未定义
    
    
    return 0;
}
一种可以理解初始化的函数substr();

输入的位置大于字符串长度会报异常

#include<iostream>
#include<string> 
using namespace std;
int main()
{
    
    string s="asdfghjkl";

    //s.substr(pos1,n)返回字符串位置为pos1后面的n个字符组成的串 
    string s2=s.substr(1,5);//sdfgh
	
    //s.substr(pos)//得到一个pos到结尾的串 
    string s3=s.substr(4);//efg
	
    return 0;
}

接下来我们尝试着加入一段字符串或者某个某些字符。

#include<iostream>
#include<string> 
using namespace std;
int main()
{
    string str="I have";
    string str2=" a dream";
    string str3=" Martin Luther King";
    string::iterator it;
 
    //s.insert(pos,str)//在s的pos位置插入str
    str.insert(6,str2);                 //I have a dream
	
    //s.insert(pos,str,a,n)在s的pos位置插入str中插入位置a到后面的n个字符
    str.insert(1,str3,0,19);             // I Martin Luther King have a dream
	
    //s.insert(pos,str,n)//在pos位置插入str字符串从开始到后面的n个字符
    str.insert(1," am",3);    // I am Martin Luther King have a dream
	
    //s.insert(pos,cstr)在s的pos位置插入cstr
    str.insert(23,",");            // I am Martin Luther King, have a dream
	
    //s.insert(pos,n,ch)在s.pos位置上面插入n个ch
    str.insert(23,3,' ');               // I am Martin Luther King   , have a dream
	
    //s.insert(s.it,ch)在s的it指向位置前面插入一个字符ch,返回新插入的位置的迭代器
    it = str.insert(str.begin()+1,':'); //I: am Martin Luther King   , have a dream
	
    //s.insert(s.it,n,ch)//在s的it所指向位置的前面插入n个ch
    str.insert (str.end(),5,'.');       // I: am Martin Luther King   , have a dream.....
	
    //s.insert(it,str.ita,str.itb)在it所指向的位置的前面插入[ita,itb)的字符串
    str.insert (it+1,str3.begin(),str3.begin()+1); // I:  am Martin Luther King   , have a dream.....
	
    return 0;
}

既然有插入,那我们就来删除某个字符或者某个字符串。

#include<iostream>
#include<string> 
using namespace std;
int main ()
{
  string str ("I am Martin Luther King, have a dream");
                          // I am Martin Luther King, 
	//str.erase(index,m);删除制定位置后面的m个字符           
  str.erase (24,13);       //            
  //直接指定删除的字符串位置第十个后面的8个字符

   //str.earse(str.begin()+m);删除第m个字符                         
  str.erase (str.begin()+23);// I am Martin Luther King
  //删除迭代器指向的字符
                                 
  str.erase (str.begin()+0, str.end()-18);
  //删除迭代器范围的字符
                            // Martin Luther King
  return 0;
}


既然有删除那就应该有在末尾添加字符或字符串

#include<iostream>
#include<string> 
using namespace std;
int main ()
{
    string str;
    string str2="I";
    string str3=" have a dream";

    //直接追加一个str2的字符串
    str.append(str2);
	                       // I
    //后面追加str3第0个字符开始的5个字符串
    str.append(str3,0,5); 
	cout<<str<<endl;                  // I have
    //追加字符串形参的前5个字符
    str.append(" a dream",8);          // I have a dream
    cout<<str<<endl;
    //直接添加
    str.append(",");
	cout<<str<<endl;                   // I have a dream,
    //添加10个'.'
    
    str.append(str3.begin()+8,str3.end());  // I have a dream,dream
    cout<<str<<endl;
    //最后这个比较特殊,意思是添加5个'A',实际上参数里面的65对应的asc码就是65
    str.append<int>(5,65);
	cout<<str<<endl;                //I have a dream,dreamAAAAA
    //字符串追加也可以用重载运算符实现
    str+="lalala";//I have a dream,dreamAAAAAlalala
    str.append(10u,'.');//I have a dream,dreamAAAAAlalala..........
	cout<<str<<endl;               
    return 0;
}

比如要讲某个字符串替换成另外一个字符串我们可以先删除再插入,可这样未免太麻烦,我们下面直接讨论替换


#include<iostream>
#include<string> 
using namespace std;
int main ()
{
    string base="123456789";
    string str2="asdfg";
    string str3="qwert";
    string str4="zxcvb";

   
    string str=base;           // 123456789
    //str.replace(index,m,str2);str从index开始的m个字符被str2替代 
    str.replace(0,5,str2);          // asdfg6789
    cout<<str<<endl;
    
    //str.replace(index1,n1,str2,index2,n2);str从index1开始的n1个字符被str2中从index2开始的n2个字符取代 
    str.replace(0,5,str3,0,5);     // qwert6789
    cout<<str<<endl; 
    
    // str.replace(index1,index2,str1);str从index1到index2的字符被字符串str1替换。 
    str.replace(8,10,"just a"); // qwert678just a
	cout<<str<<endl;
	    
//    //str.replace(index1,n,str1,m);第index1个字符以及后面的n个字符用字符串的前m个字符替换
    str.replace(8,2,"a shorty",7); //qwert678a shortst a
	cout<<str<<endl;
	
    //str.replace(index1,n,m,'c');//index1后面的n个字符替换为m和c字符 
    str.replace(18,1,3,'.');      // qwert678a shortst ...
		cout<<str<<endl<<endl; 
    //迭代器的原理同上面讲到的                                               
    str.replace(str.begin(),str.end()-3,str3);                    // qwert...
    	cout<<str<<endl; 
    str.replace(str.begin(),str.begin()+6,"replace");             // replace..
    	cout<<str<<endl; 
    str.replace(str.begin()+8,str.begin()+14,"is coolness",7);    //replace.is cool
    	cout<<str<<endl; 
    str.replace(str.begin()+12,str.end()-4,4,'o');                // replace.is coooocool
    	cout<<str<<endl;
    str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// replace.is zxcvb
     	cout<<str<<endl;
    return 0;
}

assign操作: 
assign操作在一起列容器当中都存在,比如vector等等。是一个很基本的操作函数,string使用assign可以灵活的对其进行赋值。 
代码来自cpp官网

#include<iostream>
#include<string> 
using namespace std;

int main ()
{
    string str;
    string base="The quick brown fox jumps over a lazy dog.";

    // used in the same order as described above:
    //直接把base赋值给str
    str.assign(base);
    cout << str << '\n';
    //把base第10个字符以及后面的8个字符赋给str
    str.assign(base,10,9);
    cout << str << '\n';         // "brown fox"
    //把参数中的0到6个字符串赋给str
    str.assign("pangrams are cool",7);
    cout << str << '\n';         // "pangram"
    //直接使用参数赋值
    str.assign("c-string");
    cout << str << '\n';         // "c-string"
    //给str赋值10个'*'字符
    str.assign(10,'*');
    cout << str << '\n';         // "**********"
    //赋值是10个'-'
    str.assign<int>(10,0x2D);
    cout << str << '\n';         // "----------"
    //指定base迭代器范围的字符串
    str.assign(base.begin()+16,base.end()-12);
    cout << str << '\n';         // "fox jumps over"

    return 0;
}
string的搜索操作:


string类中提供了很多性能优秀,使用方便的成员方法。而且在泛型算法当中也有很多实用的技巧


find函数主要是查找一个字符串是否在调用的字符串中出现过,大小写敏感。 
代码来自cpp官网
#include<iostream>
#include<string> 
using namespace std;


int main()
{
    
    string str ("There are two needles in this haystack with needles.");
    string str2 ("needle");

    // different member versions of find in the same order as above:
    //在str当中查找第一个出现的needle,找到则返回出现的位置,否则返回结尾
    int found = str.find(str2);
    if (found)
    cout << "first 'needle' found at: " << found << '\n';
    //在str当中,从第found+1的位置开始查找参数字符串的前6个字符
    found=str.find("needles are small",found+1,6);
    if (found)
    cout << "second 'needle' found at: " << found << '\n';
    //在str当中查找参数中的字符串
    found=str.find("haystack");
    if (found)
    cout << "'haystack' also found at: " << found << '\n';
    //查找一个字符
    found=str.find('.');
    if (found)
    cout << "Period found at: " << found << '\n';
    //组合使用,把str2用参数表中的字符串代替
    // let's replace the first needle:
    str.replace(str.find(str2),str2.length(),"preposition");
    cout << str << '\n';
    return 0;
}

rfind函数就是找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的。

#include<iostream>
#include<string> 
using namespace std;
int main()
{
    
    string str ("The sixth sick sheik's sixth sheep's sick.");
    string key ("sixth");//                    ^
    //rfind是找最后一个出现的匹配字符串
    int found = str.rfind(key);
    if (found)
    {
        cout<<found<<endl;//输出23
        str.replace (found,key.length(),"seventh");//找到的sixth替换成seventh
    }

    cout << str << '\n';
    return 0;
}
查找的效率非常高,我没看过stl源码剖析,但是感觉是用kmp实现的。呵呵,可以自己写一个。
find_….of函数:


find_first_of(args) 查找args中任何一个字符第一次出现的位置
find_last_of(args) 最后一个出现的位置
find_fist_not_of(args) 查找第一个不在args中的字符
find_last_not_of 查找最后一个不在args中出现的字符


#include<iostream>
#include<string> 
using namespace std;
int main()
{
    
    string str1 ("Please, replace the vowels in this sentence by asterisks.");
    int found1 = str1.find_first_of("aeiou");
    //把所有元音找出来用*代替
    while (found1!=std::string::npos)
    {
        str1[found1]='*';
        found1=str1.find_first_of("aeiou",found1+1);
    }
    cout << str1 << '\n';

    //在str2中找到第一个不是消协英文字母和空格的字符
    string str2 ("look for non-alphabetic characters...");
    size_t found2 = str2.find_first_not_of("abcdefghijklmnopqrstuvwxyz ");
    if (found2)
    {
        cout << "The first non-alphabetic character is " << str2[found2];
        cout << " at position " << found2 << '\n';
    }
    return 0;
}
find_last_of和find_last_not_of与first基本相同,就不写例子代码了。


比较与转换:


类似c语言的字符串比较函数strcmp函数一样,支持字符串比较操作, 


compare函数:


和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1。 


在compare当中还支持部分比较,里面有6个参数可以设置。


#include<iostream>
#include<string> 
using namespace std;

int main()
{
    
    string s1="123",s2="123";
    cout<<s1.compare(s2)<<endl;//0

    s1="123",s2="1234";
    cout<<s1.compare(s2)<<endl;//-1

    s1="1234",s2="123";
    cout<<s1.compare(s2)<<endl;//1

    string str1 ("green apple");
    string str2 ("red apple");

    if (str1.compare(str2) != 0)
    cout << str1 << " is not " << str2 << '\n';
    //str1的第6个字符以及后面的4个字符和参数比较
    if (str1.compare(6,5,"apple") == 0)
    cout << "still, " << str1 << " is an apple\n";

    if (str2.compare(str2.size()-5,5,"apple") == 0)
    cout << "and " << str2 << " is also an apple\n";
    //str1的第6个字符以及后面的4个字符和str2的第4个字符以及后面的4个字符比较
    if (str1.compare(6,5,str2,4,5) == 0)
    cout << "therefore, both are apples\n";
    return 0;
}

由于string重载了运算符,可以直接用>,<,==来进行比较,也很方便。



在io的部分有过数值和字符串相互转换的例子,使用的是stringstream函数,


在c++11当中有定义好的现成的函数取调用,非常方便。


string和数值转换
to_string(val) 把val转换成string
stoi(s,p,b) 把字符串s从p开始转换成b进制的int
stol(s,p,b) long
stoul(s,p,b) unsigned long
stoll(s,p,b) long long
stoull(s,p,b) unsigned long long
stof(s,p) float
stod(s,p) double
stold(s,p) long double


#include <bits/stdc++.h>
using namespace std;

int main()
{
    
    
    int a=atoi("100")+1;
    cout<<a<<endl;

    return 0;
}

sprintf 数字转化为字符
说明1:该函数包含在stdio.h的头文件中,使用时需要加入:#include <stdio.h>
说明2:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
说明3:sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,...] );
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串(像:"=%6.2f%#x%o",%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函数的精华。
说明4:可以控制精度
char str[20];
double f=14.309948;
sprintf(str,"%6.2f",f);
说明5:可以将多个数值数据连接起来。
char str[20];
int a=20984,b=48090;
sprintf(str,"=m",a,b);
str[]="20984 48090"
说明6:可以将多个字符串连接成字符串
char str[20];
char s1={'A','B','C'};
char s2={'T','Y','x'};
sprintf(str,"%.3s%.3s",s1,s2);
%m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。
说明7:可以动态指定,需要截取的字符数
char s1={'A','B','C'};
char s2={'T','Y','x'};
sprintf(str,"%.*s%.*s",2,s1,3,s2);
sprintf(s, "%*.*f", 10, 2, 3.1415926); 
说明8:可以打印出i的地址:sprintf(s, "%p", &i);相当于sprintf(s, "%0*x", 2 * sizeof(void *), &i);
说明9:sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值