C++ Primer Plus (第6版)学习笔记 (c风格字符串02)

先看这段代码:

char a[10];
char b[10];
cin >> a;  //输入abcd efgh
cin >> b;
cout << "a: " << a;
cout << " b: " << b;
//得到的结果:a: abcd b: efgh

当我输入abcd efgh时按下Enter键,本该再输入b的字符串,但是却没有而是直接跳过了这一指令 得到了结果这,而此时数组b显然也输出了结果,这怎么回事呢?
由于键盘不能输入空字符,因此cin使用空白(空格、制表符、换行符)来确定字符串结束的位置。这意味着cin在读取到abcd后遇到了空格,然后自动在结尾添加空字符。此时efgh还在输入队列中,第二个cin再搜索时,它发现了efgh并把它放到数组b中。这是在单独使用cin的缺点。
显然每次读取一个单词不是最好的选择,例如你要输入:I love China这句话用单独用cin是很麻烦的。幸运的是,istream中的类提供了一些面向行的类成员函数:getline()和get().这两个函数都读取一行,直到到达换行符。然而,随后getline()将丢弃换行符,而get()的换行符则保留在输入序列中下面将详细介绍它们。
1.面向行输入:getline()
getline()函数会读取会读取缓存区的一行整代码包括空格符等,直到你按下Enter键,Enter会被转化成换行符,他通过换行符结束,但它却不不存换行符。相反,在存储字符串时换行符会被转换成空字符(null)。getline()函数有两个参数,第一个参数是用来存储输入行的数组名字,第二个参数是要读取的字符数。例如:第二个参数是10,则函数最多读取9个字符,余下的空间用于在结尾处自动添加的空字符。代码示例:

char a[10];
char b[10];
cin.getline(a, 10);//输入:abcd ghfd
cin.getline(b, 10);//输入:qwer tyui
cout << "a: " << a;
cout <<" b: " << b;
//结果:a: abcd ghfd b: qwer tyui

getline()中的第二个参数值一定不要大于数组的[]括号里的值,如果大于虽然编译器不会立刻报错,但在后续的操作很容易错,千万要注意。还有输入字符串时不要越界了,一定要给自动生成的空字符保留一个位置。 
面向行的输入:get()
get()函数是istream类中的成员变量,它跟getline()函数功能相似都是读取整型数据,它们接受的参数相同,解释参数的方式也相同,但是get()函数在读取到换行符后,并不把换行符丢弃而是将它留在输入队列中。如果我们单独的使用get()函数可能达不到我们想要的效果。下面我们举两个例子:

char a[10];
char b[10];
cin.get(a, 10);
cin.get(b, 10);
cout <<"a: " << a; 
cout <<" b: " << b;
//结果为:a: 1111 b:

 我在输入第一个字符串后按下Enter键,并没有让我输入第二个字符串而是直接输入了结果。这是因为get()函数,在读取到换行符后,并没有把它扔到,而换行符仍然在输入队列中。这就导致cin.get(b,10);直接读取的第一个就是换行符,此时直接结束了函数的读取。结果就是a: 1111 b:,此时换行符还在输入队列中,你再使用一个get()函数结果也跟cin.get(b,10)一样,输出为空。
怎么解决呢?我们可以在cin.get(a,b)的下面输入一行cin.get()用于吸收输入队列中的换行符。cin.get()只能读取一个字符,cin.get()里面是没有参数的,它是get()函数的另一个版本。
还有一种方法是使用get()的方式将两个类成员函数拼接起来,就像下面这行代码:

cin.get(name,10).get();

之所以这样做是,是由于cin.get(name,10)返回一个cin对象,该对象随后将被用来调用get()函数,下面来看代码:

char a[10];
char b[10];
cin.get(a, 10).get();  //输入1111
cin.get(b, 10).get();  //输入1111
cout <<"a: " << a;
cout <<" b: " << b;
//结果:a: 1111 b: 1111

很显然这段代码达到了我们想要的结果,cin.get(a,10).get()跟cin.get(a,10)加上cin.get()很像功能也是一样的。
我们再试试这样一行代码:

	char a[10];
	char b[10];
	cin.getline(a, 10).getline(b,10);//输入1111 再输入1111
	cout <<"a: " << a;
	cout <<" b: " << b;
    //结果为:a: 1111 b: 1111

显然和我们猜想的一样是可以进行两次输入,并且输出的结果也达到了预期。说明它的效果和两次调用cin.getline()是相同的。
当然再使用get()函数和getline()函数时还会有很多的问题,在后面会提到。
目前正在读C++ Primer Plus (第6版)这本书,写博客的目的就是为了加深对这本书的印象。我理解错误和总结的不足的地方还请大佬们给我指出来。

你可能感兴趣的:(笔记,c++,学习,c语言)