标准库类型string

本文详细介绍了C++中的标准库类型string,包括其初始化、操作方法、读写操作、比较规则以及cctype头文件中的字符处理函数。通过示例展示了如何使用string进行字符串操作,如读取、连接、比较,并强调了string对象加法的注意事项。此外,还提及了基于范围的for语句在处理string对象时的应用。
摘要由CSDN通过智能技术生成

标准库类型string

string表示可变长的字符序列,使用string类型必须包含string头文件。作为标准库的一部分,string定义在命名空间std中。接下来的示例中都认为包含了下述代码:

#include <string>
using std::string;

初始化string对象的方式:

string s1;        //默认初始化s1为空串
string s2 = s1;    //s2是s1的副本
        //等价于string s2(s1);
string s3 = "hello";    //s3是字面值"hello"的副本(不包含空字符'\0')
        //等价于string s3("hello");
string s4(10, 'c');    //将s4初始化为10个字符c组成的字符串


string对象上的一些操作(详细介绍在后面):
os << s        将s写到输出流os中,返回os
is >> s               从输入流is中读取字符串赋给s,返回is
getline(is, s)    从输入流is中读取一行赋给s,返回is
s.empty()        s为空返回true,否则返回false
s.size()        返回s中字符的个数
s[n]        返回s中第n个字符的引用,n从0计起
s1 + s2        返回s1和s2连接后的结果
s1 = s2        用s2的副本代替s1中原来的字符
s1 == s2        s1和s2完全一样,则相等,对大小写敏感
s1 != s2
<, <=, >, >=    利用字符在字典中的顺序进行比较


读写string对象

在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,到遇到下一处空白为止。

int main(){
    string s;
    cin >> s;
    cout << s << endl;
    return 0;
}

使用getline可以读取一整行,包括其中的空白符,直到遇到换行符为止。

int main(){
    string s;
    while(getline(cin, s))    //每次读入一整行,直到到达文件末尾
        cout << s << endl;    //s中不含换行符,手动加上换行操作符
    return 0;
}

string::size_type类型

size函数的返回值类型并非int或unsigned,而是在类string中定义的string::size_type类型。此类型是一个无符号类型的值并且能够存放下任何string对象的值。

auto len = s.size();    //len的类型是string::size_type

如果一条表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。如表达式s.size() < -10的判断结果几乎肯定是true,因为将负值转换成无符号值会是一个比较大的值。


string对象的加法

两个string对象相加会得到一个新的string对象,其内容是将左侧的对象与右侧的对象连接而成。
C++中字符串字面值与标准库类型string是不同的类型。当把string对象和字符字面值和字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string

string s1 = "hello", s2 = "world";
string s3 = s1 +",";        //正确:把一个string对象和一个字面值相加
string s4 = "hello" + ",";    //错误:两个运算对象都不是string类型
string s5 = s1 + "," + "world";    //正确:相当于(s1 + ",") + "world"两次运算都是正确的
string s6 = "hello" + "," + s2;    //错误:先进行"hello" + ","两个运算对象都不是string类型

比较两个string类型规则

1、如果两个string长度不同,且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就是较短string < 较长string
2、如果两个string在某些对应位置的字符不同,则比较结果就是第一对相异字符按字典顺序比较的结果

string a = "Hello";
string b = "Hello World"
string c = "Hiya";

根据规则1,b > a;根据规则2,c > b。


cctype头文件

在cctype头文件中定义了一组标准库函数来方便改变某个字符的特性。(下面仅列举了一些个人认为较常用的)
isalnum(c)        当c是字母或数字时返回true
isalpha(c)        当c是字母时返回true
isdigit(c)        当c是数字时返回true
isspace(c)        当c是空白(空格、横向制表符、纵向制表符、回车符、换行符、进纸符)时返回true
islower(c)        当c是小写字母时返回true
isupper(c)        当c是大写字母时返回true
tolower(c)        如果c是大写字母,输出对应的小写字母,否则原样输出c
toupper(c)        如果c是小写字母,输出对应的大写字母,否则原样输出c
注:如cctype这个头文件,在C语言的头文件中是ctype.h,C++中兼容了C语言标准库,去掉了.h后缀,在文件名ctype前加了字母c,这里的c表示这是一个属于C语言标准库的头文件。c**和**.h头文件的内容是一样的,但命名规范上c**更符合C++的标准。


基于范围的for语句

for (declaration:expression)
    statement
decaration部分负责定义一个被用于访问序列中基础元素的变量,expression部分是一个表示被访问序列的对象,statement是循环体

string s("Hello World!");
int alpha_cnt = 0;
for (auto c : s)
    if (isalpha(c))
        ++alpha_cnt;
cout << alpha_cnt << " punctuation characters in " << s <<endl;

程序输出结果是:
10 punctuation characters in Hello World!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值