疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。
标准库内型String表示一个长度可变的字符串序列。相较于字符数组,其更加灵活。操作更加方便。
//头文件定义
#include<string>
using std::string;
一、String的定义和初始化
//分为直接初始化和拷贝初始化(有等号就认为是拷贝初始化)
string s1; // 未分配内存大小的变量
string s2(s1); // 将s1拷贝给s2 直接初始化
string s3 = "Hello!"; // 拷贝初始化
string s4(10,'A'); // s4中有10个‘A’ 直接初始化
二、String基本操作
string s; //定义string内型变量s
s.empty(); //判断s是否为空,空返回true,否则返回false
s.getline(s,s1); //按行读取字符串,以换行符判断,读取一行s1给s
s.size(); //返回s中非空长度,内型为string::size_type
s1 == s2; //比较两个字符串,以第一个相异字符的大小判断
s1 + s2; //将两个字符串首尾相连
示例代码一:
用cin输入string时,遇到空格就作为结束标志。当利用getline()函数时,以换行符作为结束标志。下面两段代码分别输入“Hello Word!”时,分别输出"Hello"和“Hello Word!”。
//用cin读取string内型变量
string word
while(cin>>word)
cout<<word<<endl;
//用getline读取string内型变量
string line
while(getline(cin,line))
cout<<line<<endl;
示例代码二
- 在使用empty()函数判断是否为空注意加“!”;
- 当合并两个字符串时可直接用“+”,但是注意不能将两个字面值直接相加,例如:s3 = “ABC” + “DEF” ,就会编译报错;
- 字符串的比较不是依据字符串长短,而是两个字符串出现的首个相异字符的大小,例如下面代码中 s2 是大于 s1 的;
- size()函数的返回值内型为 string::size_type 因此可有如下两种定义:string::size_type len = s.size(); 或者 auto len = s.size();
string s1 = "ABCDE";
string s2 = "ACD";
if (!s1.empty() && !s2.empty()) {
string s3 = s1 + s2;
string s4 = (s1>s2) ? s1 : s2;
string s5 = (s1.size()>s2.size()) ? s1 : s2;
}
三、String变量中的单个字符处理
C++也定义了很多直接对string内型变量中的单个字符的操作函数,如下图所示(来源于Primer c++ 第五版 P82):
基于范围的for语句
遍历给定序列中的所有元素,并对该元素执行操作。其基本形式如下所示。其中declaration为变量定义,expression为给定的序列,statement为执行的操作。
for(declaration: expression)
statement
示例代码一:
// s输出为:WAS LIKELY TO CONSIDER AS NEGLIGIBLE.
// 使用基于范围的for语句 需要注意定义的t是引用类型,不然无法改变字符串中的值
string s = "Was likely to consider as negligible.";
if (!s.empty()) {
for (auto &t : s) {
if(isalpha(t)) t = toupper(t);
}
}
// 使用下标访问
string s = "Was likely to consider as negligible.";
if (!s.empty()) {
for (int i = 0;i<s.size();i++) {
if(isalpha(s[i])) s[i] = toupper(s[i]);
}
}
示例代码二:
//显示字符串中的非空格和标点
//输出结果为:Waslikelytoconsiderasnegligible
string s = "Was likely to consider as negligible.";
if (!s.empty()) {
for (auto t : s)
if (!ispunct(t) && !isspace(t)) cout << t;
cout << endl;
}