《C++ Primer Plus》 第四章 复合类型 Part 2——字符串

《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

可以使用cincout输入和输出string类字符串。
cin输入string类字符串时,依然以空白作为停止标志。因此同C风格字符串一样,依然需要考虑带空白字符串输入的问题。

按行输入

string str1;
getline(cin, str1); //string类按行输入函数。
  • getline()函数读取string类型字符串时,会自动丢弃换行符,因此不需要考虑换行符对输入的影响和数字字符串混合输入问题。
  • getline()函数读取string类型字符串时,遇到空白行输入,C++会自动认为输入的时空字符串,而不会截断之后的输入。
  • 由于C++会自动调整string类型的长度,所以不需要考虑输入溢出的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值