原创 【博客大赛】《C++ Primer》学习笔记(七)字符串

2016-3-15 21:04 864 17 18 分类: MCU/ 嵌入式 文集: Qt和Cpp



首先了解一下命名空间。
如果要在当前文件使用别的命名空间的变量,比如cin,可以这样:
std::cin >> i;

如果要声明某命名空间的单一成员,可以这样:
using std::cin;
int main()
{
    int i;
    cin >> i;
    return 0;
}
一般来说,头文件不允许使用using声明,因为有的.cpp文件不需要这个using。

如果要声明某命名空间的所有成员,可以这样:
using namespace std;
int main()
{
    int i;
    cin >> i;
    cout << "Hello, world." << endl;
    return 0;
}

现在可以声明string相关的命名空间啦~
#include
using std::string;

定义并初始化string:
string s1;
string s2 = s1;
string s3 = "Good";
string s4(10, 'c');
string s5("Wonderful");
string s6(s5);

注意末尾的'\0'是不会被拷贝进string里面的。
另外,string不仅包含数据,还包含数据可进行的操作:

getline(cin, s5);
cout << s5 << endl;
cout << s5.empty() << endl;
cout << s5.size() << endl;
cout << s5[2] << endl;
cout << (s5 >= s3) << endl;
cin >> s2;
cout << s2 << endl;

这里注意,cin只取由空格、换行、tab隔开的某一字符串;
而getline会取整行,保留空格和tab键。

string::sizetype是专门为描述字符串长度定义的数据类型。
它是无符号的数,不要把它和有符号的数做比较。

auto和decltype可以用来获取字符串长度string::sizetype的类型。
但是有的编译器可能不支持它们,此时只需要在编译命令后面加上-std=c++11即可。

----------------
如何比较字符串的大小?
 • 如果两个字符串长度不一样,而且短字符串的每个字符都和长字符串相同,则短字符串小于长字符串。
 • 如果两个字符串的任意一个字符不一样,则第一个不一样的字符的大小决定了字符串的大小。
如何将两个字符串相加?
 • string s3 = s1 + s2;
 • string s4 += s3;
 • string s5 = "Hello" + s1 + " " + s2 + "\n"; //右边的第一个操作数必须是string类

----------------
对单个字符进行操作的函数:
isalnum(c)  // 如果是字母或数字则返回真
isalpha(c)  // 如果是字母则返回真
iscntrl(c)  // 如果是控制字则返回真
isdigit(c)  // 如果是数字则返回真
isgraph(c)  // 如果可打印且不为空格则返回真
islower(c)  // 如果是小写字母则返回真
isprint(c)  // 如果可打印则返回真
ispunct(c)  // 如果是标点符号则返回真
isspace(c)  // 如果是空格则返回真
isupper(c)  // 如果是大写字母则返回真
isxdigit(c) // 如果是十六进制数则返回真
tolower(c)  // 如果c为小写,则返回大写,否则返回c
toupper(c)  // 如果c为大写,则返回小写,否则返回c

对字符进行上述操作时,记得:
#include

其实上述函数都来自c里的ctype.h,但是在c++中会将.h后缀去掉,增加c的前缀,因此就不要使用:
#include "ctype.h"
因为它会给编译器带来负担。

----------------
如果获取字符串的每个字母?
使用range for表达式吧!

string str("some string");
for (auto c : str)
    cout << c << endl;

for循环的含义是:For every character c in the string str.

如果想对字符串的每个字母进行修改操作?
那就要在rang for中使用引用。

string s("Hello World!!!");
for (auto &c : s)
    c = toupper(c);

使用下标subscript可以修改单个的字母:
s[0] = 'a';
下标的范围默认不会检测,溢出的后果undefined。
 

文章评论1条评论)

登录后参与讨论

用户593939 2016-3-16 22:52

写的好,参考和学习了
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
我要评论
1
17
关闭 站长推荐上一条 /2 下一条