C++之复合类型(一)

1.数组

数组是一种数据格式,能够存储多个同类型的值。

数组的初始化规则:

  1. 数组只有在定义的时候才能使用初始化。

  2. 初始化数组的时候,提供的值可以少于数组的元素数目。(其他元素会自动被设为0)

  3. 初始化下标从0开始

(注:求一个数组的长度。
eg:
short things[]={1,2,3,4};
int num_elements=sizeof things/sizeof(short);

2.字符串

字符串是存储在内存的连续字节中的一系列字符。

#代码2.1
#include<iostream>
#include<cstring>
int main()
{using namespace std;const int Size = 15;char name1[Size];char name2[Size] = "iDoit";char food[Size];cout << "你好,我的名字是" << name2;cout << "!n你的名字是?n";cin>> name1;cout << "hellow," <<name1<<"。n";cout <<" 你最喜欢吃什么?" << endl;cin >> food;cout << "万万没想到,你竟然喜欢吃" << food << "nnn"<<endl;system("pause");return 0;   
}

当键盘输入姓名如“张三”,食物“辣椒”时(每个名词之间没有空格、制表符)。输出结果正确,如下所示

你好,我的名字是iDoit!
你的名字是?
张三
hellow,张三。你最喜欢吃什么?
辣椒
万万没想到,你竟然喜欢吃辣椒

但当姓名中包含空格或制表符,如输入姓名:“San Zhang”时,便得到下面结果:

你好,我的名字是iDoit!
你的名字是?
San Zhang
hellow,San。你最喜欢吃什么?
万万没想到,你竟然喜欢吃Zhang

对于c++的字符串输入:
cin使用空白(空格’ ‘、制表符’t’和换行符’n’)来确定字符串的结束位置。因此在读取一行字符串输入时,要将整条短语而不是一个单词作为字符串输入,需要采取另一种字符串读取方法,具体地说,需要采用面向行而不是面向单词的方法(这也就是产生上述情况的原因)。
istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,getline()将丢弃换行符,而get()将换行符保留在输入序列中。
例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以使用这样的函数调用:

cin.getline(name,20);

对于代码2.1修改为cin.getline(),其他代码不变,姓名输入:“San Zhang”,食物:“Pepper”得到的结果如下所示

你好,我的名字是iDoit!
你的名字是?
San Zhang
hellow,San Zhang。你最喜欢吃什么?
Pepper
万万没想到,你竟然喜欢吃Pepper

面向行的输入:get()

istream类中有另外一个名为get()的成员函数,他有几种变体,其中一种与getline()相似,他们接受的参数相同,解释的参数方式也相同,并且都读取到行尾。但不同的是get()并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续两次调用get():

cin.get(name1,Size);
cin.get(name2,Size);//会出现问题

由于第一次调用后,换行符将留在输入队列中,因此第二次调用的时候看到第一个字符便是换行符,因此get认为到达了行尾,而没有发现任何可读取的内容。如果不借助帮助,get()将不能跨过该换行符。但是get()还有另外一种变体,使用不带任何参数的cin.get()调用可读取下一个字符(即使是换行符),因此它可以用来处理换行符,魏都区下一行做准备。即

cin.get(name1,Size);
cin.get();
cin.get(name2,Size);//正常读取

(注:无参数的cin.get()仅仅读取一个字符并在输入流中删除所读字符,不做其他任何操作)

另外一种写法是

cin.get(name1,Size).get();
cin.get(name2,Size);//正常读取

之所以这样做,是由于cin.get(name1,Size)个返回来的是一个对象,该对象随后将被用来调用get()函数。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平