【C/C++】C++ 标准库函数string类型要点总结

本文详细介绍了C++中字符串对象的定义、初始化、读写、基本操作、赋值、下标处理以及字符处理等内容,并通过实例展示了如何在代码中运用这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String 对象的定义和初始化

string 标准库支持下面几个构造函数。
|-- string s1;                默认构造函数,s1为空串
|-- string s2(s1);            将s2初始化s1的一个 副本
|-- string s3("C_SuooL_Hu");  将s3初始化为一个字符串字面值的副本
|-- string s4(n, 'c');        将s4初始化为字符c的n个副本

注意:字符串字面值和string类型不是同一种类型。

String对象的读写和基本操作

①iostream标准库读写:cin>>s;

读取规则:从标准输入读取string,并存入串s中。

| -- 读取并忽略开头的空白字符

| -- 读取直至再次遇到空白字符为止。

例如:输入     hello world  ;  串s值为hello

读取未知数目的string对象

  1.       string word;  
  2. hile(cin>> word)  
  3. cout<<word<<endl;  

②getline读取整行文本

  1. while(getline(cin,word))  
  2.     cout<<word<<endl;  

getline不忽略开头和结尾的空白字符,它只要遇到换行符(即使在开头也一样)停止读入并返回(不读入换行符)。换-行符不存储在string对象中。

③string对象的操作

|-- s.size()       返回s中字符的个数(成员函数)
|-- s.empty()      判断字符串是否为空(成员函数)
|-- s[n]           返回s中位置为n的字符,位置从0开始计数
|-- s1 + s2        链接字符串

|-- s1 = s2        将s1替换成s2的副本

|-- s1 == s2       比较s1和s2的内容,如果相同,返回true

|-- !=, < , <=,>, >= 保持其原有意思

********判断一个string 对象是否为空的方法有两种,一种使用s.size和0进行比较,一种使用s.empty()来进行判断
********** 字符串的赋值:有时会有效率上的影响。如:

string str1;

str2 = "hello"

str1 = str2;

它必须先释放掉是str1占用的相关内存,然后分配给str1足够存放str2副本的内存空间,最后把str2中的所有字符复制到新分配的内存空间。

**********当进行string对象和字符串字面值混合连接时,+操作符的左右操作数至少有一个是string类型的。(连接方向从左至右)

实例: string s1 = "Hello";  string s2 = "world" ;

string s3 = s1 + ", " + "world" ;    // 正确

string s4 = "Hello" + ", " + s2 ;    // 错误

********string::size_type类型,注意:string对象操作中的size()返回的值不是int型的,而是size_type()类型的任何存储string的size操作结果的变量必须是string::size_type类型的,特别重要的是,不要将size的返回值赋给整型类型。string::size_type类型在不同的机器上长度是不同的,并非是固定的,但是只要你使用了这个类型,就使你的程序适合这个机器,与实际机器匹配。但是使用int类型的时候,如果你的string:size_type长度刚好和int类型匹配,那么结果正确,但是如果二者不相同(比如换平台了),那么结果就完全不一样了(具体例子可以看百度百科:http://baike.baidu.com/link?url=u-bqQRoPPGzAkDetbzEZQCdhwVDoAr_YrGk6NiRbJF6dCOMkxcGwaWdKvy6m9ydhfq4TlsLtRGs-bVDirYBpy_

********* == 比较两个string对象是否相等,相等指的是:长度相同,且含有相同字符。

********* 关系操作符用于测试两个string对象的大小关系,比较时采用了和(大小写敏感)字典排序相同的策略

实例: “Hiyya”  > "Hello"   "Hello" < "Hello World!" .

********下表操作:string对象下标是从0开始的,若为空则不含s[0]。

① 获取每个字符

  1.      string s1 = "hello world";  
  2. or(string::size_type i=0;i<=(s1.size()-1);i++){  
  3. cout<<s1[i]<<endl;  

②下表作为左值:

  1. string s1 = "hello world";  
  2. s1[0]='*';  
  3. cout<<s1<<endl; //"*ello world"  

③任何可产生整型值的表达式都可以作为下标操作符索引。(不过string对象的索引最好也是string :: size_type类型)


String对象中字符的处理

string中单个字符的处理,使用头文件cctype

以下为字符函数库中常用的函数:

函数名称返回值
isalnum()如果参数是字母数字,即字母或数字,该函数返回true
isalpha()如果参数是字母,该函数返回真
isblank()如果参数是空格或水平制表符,该函数返回true
iscntrl()如果参数是控制字符,该函数返回true
isdigit()如果参数是数字(0~9),该函数返回true
isgraph()如果参数是除空格之外的打印字符,该函数返回true
islower()如果参数是小写字母,该函数返回true
isprint()如果参数是打印字符(包括空格),该函数返回true
ispunct()如果参数是标点符号,该函数返回true
isspace()

如果参数是标准空白字符,如空格、进纸、换行符、回车

、水平制表符或者垂直制表符,该函数返回true

isupper()如果参数是大写字母,该函数返回true
isxdigit()如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
tolower()如果参数是大写字符,则返回其小写,否则返回该参数
toupper()如果参数是小写字母,则返回其大写,否则返回该参数

例子:去掉输入字符的标点符号
  1. string s1;  
  2.     while(getline(cin,s1)){  
  3.         for(string::size_type i=0;i<s1.size();i++){  
  4.             if(ispunct(s1[i])){//如果存在标点符号  
  5.                 s1[i] = ' ';  
  6.             }  
  7.         }  
  8.         cout<<s1<<endl;  
  9.     }  

综合实例:

  1. /** 
  2. String 类的使用 
  3. 2013 10 26 
  4. */  
  5. #include <iostream>  
  6. #include <string>                     //使用string的时候要加上这个  
  7.   
  8. using namespace std;  
  9.   
  10. int main(){  
  11.     //初始化string对象,一共有4种方式  
  12.     cout << "This is the instalization of string :" << endl;  
  13.     //方式一  
  14.     string s1;                      //初始化s1为空的串  
  15.     cout << "S1 = " << s1 << endl;   
  16.     //方式二  
  17.     string s2(s1);                      //将s2初始化成s1的副本  
  18.     cout << "S2 is the copy of s1 :" << s2 << endl;  
  19.     //方式三  
  20.     string s3("");                      //将s3初始化成字符串的副本  
  21.     cout << "S3 = " << s3 << endl;  
  22.       
  23.     //方式四  
  24.     string s4(10, 'c');                 //将s4初始化成10个c的副本  
  25.     cout << "s4 is : "  << s4 << endl;  
  26.     system("echo off");  
  27.     system("color 2");  
  28.   
  29.     //用getline来读取整行文本  
  30.     string line;  
  31.     cout << "Please input a line words: And this is using the function getline()" << endl;  
  32.     getline(cin, line);  
  33.     cout << line << endl;  
  34.     //string中对象的操作  
  35.     string stest("http://blog.youkuaiyun.com/hu1020935219");  //声明stest对象  
  36.     //s.size()  
  37.     cout << "The size of " << stest << " is: " << stest.size() << endl;  
  38.     //s.empty()   
  39.     if(stest.empty()){              //判断string对象是否为空的一种方法:s.empty()  
  40.         cout << "stest is empty(using s.empty())" << endl;  
  41.     }else{  
  42.         cout << "stest is not empty(using s.empty())" << endl;  
  43.     }  
  44.     //使用s.size()和0进行比较尽心判断  
  45.     if(stest.size() == 0){                                              //判断string对象是否为空的一种方法:s.size()  
  46.         cout << "stest is empty(using s.size())" << endl;  
  47.     }else{  
  48.         cout << "stest is not empty(using s.size())" << endl;  
  49.     }  
  50.     //从string 对象中获得字符,采用下标操作  
  51.     string s5("http://blog.youkuaiyun.com/hu1020935219");  
  52.     cout << "逐个输出string对象中字符:(using 下标操作)" <<endl ;  
  53.     for (string::size_type ix = 0; ix != s5.size(); ++ix){   //注意一下++ix和ix++的区别  
  54.         cout << s5[ix] << ' ';  
  55.     }  
  56.     cout << endl ;  
  57.     //string中单个字符的操作:比如判断单个字符是否为大写字母  
  58.     string s6("HuZhenjie");  
  59.     string::size_type upcount = 0;  
  60.     for (string::size_type index = 0; index != s6.size(); ++index){    //++i 和 i++  
  61.         if (isupper(s6[index])){  
  62.             ++upcount;  
  63.         }  
  64.     }  
  65.     cout << "There are " << upcount << " UpperLetters in " << s6 << endl;  
  66.     //将大写字母转换成小写字母  
  67.     for (string::size_type ind = 0; ind != s6.size(); ++ind){   //++i 和 i++  
  68.         s6[ind] = tolower(s6[ind]);                                     //进行大小写转换,将大写字母转换成小写字母  
  69.     }  
  70.     cout << "the String is: HuZhenjie, and Then use tolower() we get:";  
  71.     cout << s6 << endl;  
  72.     return 0;  
  73. }  


运行效果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值