《C++ Primer Plus》 第四章 复合类型 Part 2
和字符串有关的库:
#include <string> // make string class available
#include <cstring> // C-style string library
C风格字符串
字符串的声明
char cat[4] = {'f', 'a', 't', '\0'};
- C风格字符串有一种特殊的性质,即以空字符结尾。空字符被写作
\0
,其ASCII码为0.用来标记字符串的结尾。
例如,
char cat[3] = {'f', 'a', 't'}
被视为字符数组,而不是字符串。
\0
用来标记字符串的结尾的深入理解。
char str[5] = {'a', 'b', '\0', 'd', '\0'};
cout << str << endl;
输出的结果是ab
而不是abd
。因为\0
用来标记字符串的结尾。C++在读取到这个标记时就会认为字符串结束,不会继续向后读取。
#include<iostream>
using namespace std;
int main()
{
char Name[20] = "NiuJuxin";//之后的内容。
cout << "My Name is " << Name << endl;
Name[3] = '\0';
cout << "My First Name is " << Name << endl;
return 0;
}
输出结果:
My Name is NiuJuxin
My First Name is Niu
为了简单,字符串可以直接用双引号括起来。此时,C++将自动在最后一个字符后面添加\0
.例如
char Name[20] = "NiuJuxin";
字符串常量的拼接
有时候,字符串很长,无法放到一行中.C++允许字符串拼接.
#include <iostream>
using namespace std;
int main()
{
char str[] = "Nice "
"To "
"Meet "
"You!";
cout << "Nice to meet you "
"TOO!\n";
return 0;
}
C风格的字符串不能将一个字符串赋值给另一个字符串。
C风格的字符串必须在声明时同时赋值,即初始化。
例如:
char str[40];
str = "Amy";
是不合法的。
和字符串有关的函数
sizeof()
函数
sizeof()
函数指出占用的字节数.
例如:
对于数组char Arr[10]
,sizeof(Arr)
计算的是整个数组占用的字节数.而sizeof(Arr[3])
计算的是第四个值占用的字节数.
strlen()
函数
strlen()
函数指出该数组中非\0
字符的数量.
例如:
char str[] = "AAA AAA AAA.";
cout << strlen(str) << endl;
输出结果是12.
strcpy()
函数和strcat()
函数。
strcpy()
函数和strcat()
函数用来替代string类型的赋值、符加等操作。
strcpy(charr1, charr2); // copy charr2 to charr1
strcpy(charr1, "Sugar"); // add Sugar to end of charr1
strcat(charr1, " juice"); // add juice to end of charr1
cin.get()
&cin.getline()
函数
C++中
cin
输入默认将空白(比如空格)视为输入的结束标志.
比如,如果想要输入的数组是Niu Juxin
,单纯使用cin
则只会读取Niu
,读取到空格时结束.
为了避免这种状况,需要使用cin.get()
和cin.getline()
函数来读取整行.
cin.get()
和cin.getline()
函数都将换行符\n
视为结束标志.
使用方法:
char str[100];
cin.get(str, 50);
cin.getline(str, 50);
为了避免cin.get()
函数保留换行符的操作,可以在之后单独使用cin.get()
读取换行符.或者将其合并为整体:
#include <iostream>
using namespace std;
int main()
{
char str[100];
cin.get(str, 50);//1
cin.get();//2
//1和2可以合并为:
//cin.get(str, 50).get();
return 0;
}
cin.get()
和cin.getline()
函数的区别
混合输入字符串和数字
混合输入数字和面向行的字符串会导致问题.
示例:
// numstr.cpp -- following number input with line input
#include <iostream>
int main()
{
using namespace std;
cout << "What year was your house built?\n";
int year;
cin >> year;
// cin.get();
cout << "What is its street address?\n";
char address[80];
cin.getline(address, 80);
cout << "Year built: " << year << endl;
cout << "Address: " << address << endl;
cout << "Done!\n";
// cin.get();
return 0;
}
如果我们输入
1966
......//省略
得到的输出结果是:
What year was your house built?
1966
What is its street address?
Year built: 1966
Address:
Done!
当cin
读取年份时,将回车键生成的换行符留在了输入队列中.后面的cin.getline()
读取到换行符时认为是一个空行,并将一个空字符串赋给address数组.因此需要使用cin.get()
读取一个换行符.
因此在使用面向行的输入时要格外注意空白对输入的影响.
String
字符串
string
字符串支持C风格字符串的初始化
可以使用cin
将键盘输入存储到string
对象中
可以使用cout
来显示string
对象
可以使用数组表示法访问存储在string
对象中的字符。
string A = { "Nice to meet you" };
string B = { 'a', 'e', 'd','e' };
string C = "Nice to meet you !";
string D = "nice "
"to"
"Meet";
string E;
cin >> E;
cout << A << endl;
cout << A[3] << B[3] << endl;
string新特性
赋值、拼接、符加
- C++支持将一个string对象赋值给另一个string对象。
- C++支持使用运算符+将两个string对象合并起来。还可以使用+=将一个string附到另一个string对象后面。
string A = { "Nice to meet you" };
string B = { 'a', 'e', 'd','e' };
string C = "Nice to meet you !";
string D = "nice ";
A = B;
B = C;
A = B + C;
B += D;
确定字符串中字符数的方法:
int lenA = A.size();
string类I/O
可以使用cin
和cout
输入和输出string类字符串。
cin
输入string
类字符串时,依然以空白作为停止标志。因此同C风格字符串一样,依然需要考虑带空白字符串输入的问题。
按行输入
string str1;
getline(cin, str1); //string类按行输入函数。
getline()
函数读取string
类型字符串时,会自动丢弃换行符,因此不需要考虑换行符对输入的影响和数字字符串混合输入问题。getline()
函数读取string
类型字符串时,遇到空白行输入,C++会自动认为输入的时空字符串,而不会截断之后的输入。- 由于C++会自动调整string类型的长度,所以不需要考虑输入溢出的问题。