c++ string 类基本用法

C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总结<引用>

 

一,C语言的字符串

在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型——指针。

比如下面这个例子:

//example 1:

char str[12] = "Hello";

char *p = str;

*p = 'h';  //改变第一个字母

 

//example 2:

char *ptr = "Hello";

*ptr = 'h';  //错误

 

第一个字符串时用数组开辟的,它是可以改变的变量。而第二个字符串则是一个常量,也就是字面值。ptr只是指向它的指针而已,而不能改变指向的内容。

看两者的汇编即可明了:

char p[] = "Hello";
004114B8  mov         eax,dword ptr [string "Hello" (4166FCh)] 
004114BD  mov         dword ptr [ebp-10h],eax 
004114C0  mov         cx,word ptr ds:[416700h] 
004114C7  mov         word ptr [ebp-0Ch],cx

char *ptr = "Hello";
004114CB  mov         dword ptr [ebp-1Ch],offset string "Hello" (4166FCh)

可见用数组和用指针是完全不相同的。

要想通过指针来改变常量是错误,正确的写法应该是用const指针。

const char *ptr = "Hello";

 

 

二,初识string类

正是因为C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。注意<string.h>和<cstring>都是错误的,这两个头文件主要定义C风格字符串操作的一些方法,譬如strlen(), strcpy()等。第一个是C的头文件格式,而第二个是C++风格的头文件,但是和<string.h>是一样的,它的目的是为了和C兼容。

看下面例子:

//example 3:

string str("world");   //可以用C风格字符串初始化

string words = "Hello";

string greet = words;

string  join = greet + words;  //可以像基本类型一样操作

 

但是如果试图把string类型的对象直接赋给C风格的字符串的话,编译器会报错的。

string var = "Olympic";

char *ptr = var;  //error!

 

但是实际应用中这个问题也难以避免,很多时候我们还是需要将string类型的转化为char*来实现自定义的操作,C++标准库也为了和之前用C写的程序兼容,于是可以用string的c_str()函数。

string var = "Olympic";

char *ptr = var.c_str(); //还不能被编译

 

但是c_str()为了防止意外地修改string对象,返回的是const指针,所以上面这段代码是不能被编译的。正确的应该是用const指针。

string var = "Olympic";

const char *p = var.c_str(); //Correct!

 

这个c_str()方法在C++IO流操作上也被广泛应用。

在打开文件时,如果要指定文件名,可以用C风格的字符串。如果用到string类型的字符串作为文件名时,就必须调用c_str()方法将其转换为一个C风格字符串。

//example 4:

string   filename;  //定义文件名称

cin >> filename;

ifstream.open(filename.c_str());  //要使用C风格字符串

#include <string>    //  使用 string 类时须包含这个文件
#include <iostream>

using namespace std;

int main()
{
    
string str1;
   
    
//  输入与输出
    cout << "输入字符串 str1" << endl;
    cin 
>> str1; getchar();
    cout 
<< str1 << endl << endl << endl;
    
    
//  一行行读取 
    cout << "输入字符串 str1" << endl;
    getline( cin, str1 );
    cout 
<< str1 << endl;

    
//  与 c字符转换
    string str2("Hello World!"), str3;
    
char   str4[50];

    cout 
<< "输入 C 字符串" << endl;
    scanf(
"%s",str4);
    str3
= str4;

    cout 
<< "str2 is " << str2 << endl;
    cout 
<< "str3 is " << str3 << endl << endl << endl;

    
//  求字符串的长度
    string str5;
    cout 
<< "输入字符串 str5" << endl;
    cin 
>> str5;
    
int   len= str5.size();
    cout 
<< "字符串 str5的长度为" << len << endl << endl << endl;

    
//  遍历字符串例子
    string str6;
    cout 
<< "输入字符串 str6" << endl;
    cin 
>> str6;
    
int i;
    
for( i= 0; i< str6.size(); ++i )
    cout 
<< str6[i];
    cout 
<< endl << endl;

    
//  比较两个字符串   比较规则同 c字符串比较规则
    string str7, str8;
    cout 
<< "输入字符串 str7, str8 , 中间用空格格开" << endl;
    cin 
>> str7 >> str8;

    
if( str7< str8 ) cout << str7 << "  小于 " << str8 << endl;
    
else if( str7> str8 ) cout << str7 << "  大于 " << str8 << endl;
    
else cout << str7 << "  等于 " << str8 << endl;
    
    
    
//  字符串与字符相加 
    string str9= "Darren";
    
char ch1= 'a', ch2= 'b';
    str9
= str9+ ch1; cout << str9 << endl << endl;
    str9
= ch2+ str9; cout << str9 << endl << endl << endl;
    
    
//  字符串与字符串相加
    string str10= "Acm", str11= "ICPC";
    str10.append( str11 );
    cout 
<< str10 << endl << endl;
    
    
//  字符串是否包含子串  如果包含 则返回子串在目标串中第一次出现的位置 
    string str12= "I am a student", str13= "student", str14= "aaaaaaa";
    
if( str12.find( str13 )!= -1 )  cout << "Find " << str13 << endl;
    
if( str12.find( str14 )== -1 )  cout << "Not Find  " << str14 << endl;
    
    
//  转换成 c_字符串
    string str15= "Hello World";
    printf(
"%s\n", str15.c_str() );
     
    system(
"pause"); 

    
return 0;
}

1 #include <string>
 2 #include <iostream>
 3  
 4 int main()
 5 {
 6     std::string a = "0123456789abcdefghij";
 7  
 8     std::string sub1 = a.substr(10);
 9     std::cout << sub1 << '\n';
10  
11     std::string sub2 = a.substr(5, 3);
12     std::cout << sub2 << '\n';
13  
14     std::string sub3 = a.substr(12, 100);
15     std::cout << sub3 << '\n';
16  }
复制代码

Output:

1 abcdefghij
2 567
3 cdefghij

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值