C++每日一课(十)

字符串
字符串就是存在内存中的一连串连续的字符
处理字符串的方式
1.C风格的字符串处理方式
2.基于String类库的处理方法


C风格的字符串处理
以空字符(\0)结尾,来标识字符串的结尾
char c1[3] = {'a','b','c'};这不是一个字符串
char s1[3] = {'a','b','\0'};这是一个字符串


上面的两个数组都是char数组,但是第二个是字符串,对于字符串中的最后一个'\0'空字符是很重要的。
C++中有很多的字符串处理函数,它们都是逐一的处理字符串中的字符直到遇到'\0'字符才结束


使用字符串常量进行字符串数组的初始化
char s[3] = "ab";
char s1[] = "ab";
第一种如果指定了字符数组的长度则需要计算好'\0'所需要的空间,第二种编译器会自己去计算需要的字符数组的长度
注意:使用的是双引号括起来的才是字符串常量,使用单引号括起来的是字符常量


拼接字符串常量
任何两个邮空白(空格、制表符、换行符)分隔的字符串常量都会自动拼接成一个字符串常量
注意:拼接时不会在被连接的字符串之间添加空格,第二个字符串中的第一个字符紧跟着字符串的最后一个字符后,第二个字符串的第一个字符会替换掉第一个字符串中的'\0'


字符串数组使用
要把字符串存到数组中,最为常用的方法有两种方法
1.把数组初始化为字符串常量
2.把键盘或文件输入读入到数组中


/*
作者:xiesheng
时间:2017-06-27
版本:v1.0
说明:字符串
*/


#include <iostream>


int main() {
	using namespace std;
	const int Size = 15;


	char name1[Size];	//空的字符数组
	char name2[Size] = "Hello";	//初始化字符串数组


	cout << "name2中的值:" << name2 << endl;
	cout << "请输入你的名称:\n";
	cin >> name1;
	cout << "名称:" << name1 << endl;
	cout << strlen(name1) << "个字符";
	cout << "name1占字节数:" << sizeof(name1) << endl;
	cout << "name1中的首字母是:" << name1[0] << endl;
	name2[3] = '\0';
	cout << "当name2中的第三个元素赋值为\0后输出name2的结果:" << name2 << endl;


	system("pause");
	return 0;
}



name2中的值:Hello
请输入你的名称:
advent
名称:advent
6个字符name1占字节数:15
name1中的首字母是:a
当name2中的第三个元素赋值为Hel
请按任意键继续. . .




其中sizeof运算符指出整个数组的长度,strlen()是指计算出字符串数组中的可见字符个数,这里的可见字符不包含'\0'
对于字符串数组来说可以使用数组名加上下标来访问指定的元素。比如name1[0]
程序中把name2[3]设置为空字符,就会使得字符串在第3个字符后就会结束就算它后面还有其它的字符


/*
作者:xiesheng
时间:2017-06-28
版本:v1.0
说明:字符串
*/


#include <iostream>


int main() {
	using namespace std;
	const int Size = 20;
	char name[Size];
	char s[Size];


	cout << "请输入你的名字:\n";
	cin >> name;
	cout << "请输入你的家乡:\n";
	cin >> s;
	cout << "我的家乡在:" << s << "; 我的名称是: " << name << endl;


	system("pause");
	return 0;
}



请输入你的名字:
xiao xie
请输入你的家乡:
我的家乡在:xie; 我的名称是: xiao
请按任意键继续. . .


从结果中我们可以看到这里还没有输入家乡就把后面的结果给打印出来了
原因中在键盘输入的时候是无法输入空字符的,cin需要判断字符串的结尾,那cin就使用空白(空格、制表符、换行符)来做为字符串输入的结束
这样的话则cin读入的时候只读到从开头到第一个空白之间的字符写入到数组当中并自动加上\0,后面还没有读入的则会保留在输入队列当中,如果程后面还有cin则会从输入队列中去找


如何实现每次读取一行字符串的输入
cin中有成员函数getline()、get()
getline()和get()都可以读取一行输入,直到读到换行符,但是getline()会丢弃掉最后的换行符,而get()会把换行符保留在输入序列中。


getline():
读取整行,它通过回车键输入的换行来确定输入结尾。
调用方法:cin.getline()
参数有两个:
1.第一个参数用来存储输入行的数组的名称
2.表示要读取的字符数(如果这里参数是100,则最多读取99个字符,最后一个空间要预留下来存储结束空白符)


getline()函数在读取指定数目的字符或者是遇到换行符时结束读取


/*
作者:xiesheng
时间:2017-06-28
版本:v1.0
说明:字符串
*/


#include <iostream>


int main() {


	using namespace std;
	const int Size = 20;
	char name[Size];
	char prov[Size];
	cout << "请输入你的名字:\n";
	cin.getline(name, Size);
	cout << "请输入你的家乡:\n";
	cin.getline(prov, Size);
	cout << "我的名字是:" << name << " 我的家乡在:" << prov << endl;


	system("pause");
	return 0;
}




请输入你的名字:
xiao xie
请输入你的家乡:
hu nan
我的名字是:xiao xie 我的家乡在:hu nan
请按任意键继续. . .




get():
get()与getline()的区别是不会丢弃掉换行符,而是把它留在输入队列中,这样会导致第一读取后换行符在读取数列中,第二次读取时会读到这个换行符认为到了行尾这样就无法跨过换行符了。
get()函数有另一种变体,不带任何参数,表示读取下一个字符cin.get(),可以使用它来处理掉换行符,在两次读取之间调用cin.get()就可以了
另外在使用get()时可以使用连续拼接的方式,比如:cin.get(name,Size).get();
注意:上面这种拼接的方式对于getline()来说也是可以的


/*
作者:xiesheng
时间:2017-06-28
版本:v1.0
说明:字符串
*/


#include <iostream>


int main() {


	using namespace std;
	const int Size = 20;
	char name[Size];
	char prov[Size];
	cout << "请输入你的名字:\n";
	cin.get(name, Size).get();
	cout << "请输入你的家乡:\n";
	cin.get(prov, Size).get();
	cout << "我的名字是:" << name << " 我的家乡在:" << prov << endl;


	system("pause");
	return 0;
}




请输入你的名字:
xiao xie
请输入你的家乡:
hu nan
我的名字是:xiao xie 我的家乡在:hu nan
请按任意键继续. . .


从上面我们看到一个get()函数有不同的版本,这个是允许的但是要求参是不一样的,这样C++在编译的时候对调用的方法才可以确定唯一个方法




关于空行和输入的字符串过长的问题
当getline()或get()读取空行时会发生什么情况呢?
当get(),注意不是getline(),读取空行后会设置失效位,它意味着接下来的输入会被阻断,可以使用cin.clear()来恢复输入


当输入的字符串比分配的空间长时,则getline()和get()会把剩下字符留在输入除列中,而getline()还会设置失效位,并且关闭后面的输入




混合的输入数字与字符串


注意对于输入数字后回车这样的字符会保留在输入对列中,这样会导致后面没有机会输入接下来的字符串
可以在输入数字后使用cin.get()把回输换行处理掉


/*
作者:xiesheng
时间:2017-06-28
版本:v1.0
说明:字符串
*/


#include <iostream>


int main() {


	using namespace std;
	cout << "你出生的年份是:\n";
	int year;
	cin >> year;
	cin.get();
	cout << "你出生的省份是:\n";
	char prov[20];
	cin.getline(prov, 20);


	cout << "你出生的年份是:" << year << " 出生的省份是:" << prov << endl;


	system("pause");
	return 0;
}



你出生的年份是:
1985
你出生的省份是:
hu nan
你出生的年份是:1985 出生的省份是:hu nan
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/advent86/article/details/73825268