1.数组
数组是一种数据格式,能够存储多个同类型的值。
数组的初始化规则:
数组只有在定义的时候才能使用初始化。
初始化数组的时候,提供的值可以少于数组的元素数目。(其他元素会自动被设为0)
初始化下标从0开始
(注:求一个数组的长度。eg:shortthings[]={1,2,3,4};intnum_elements=sizeofthings/sizeof(short);)
2.字符串字符串是存储在内存的连续字节中的一系列字符。
#代码2.1#includeiostream#includecstringintmain(){usingnamespacestd;constintSize=15;charname1[Size];charname2[Size]="iDoit";charfood[Size];cout"你好,我的名字是"name2;cout"!\n你的名字是?\n";cinname1;cout"hellow,"name1"。\n";cout"你最喜欢吃什么?"endl;cinfood;cout"万万没想到,你竟然喜欢吃"food"\n\n\n"endl;system("pause");return0;}
当键盘输入姓名如“张三”,食物“辣椒”时(每个名词之间没有空格、制表符)。输出结果正确,如下所示
你好,我的名字是iDoit!你的名字是?张三hellow,张三。你最喜欢吃什么?辣椒万万没想到,你竟然喜欢吃辣椒
但当姓名中包含空格或制表符,如输入姓名:“SanZhang”时,便得到下面结果:
你好,我的名字是iDoit!你的名字是?SanZhanghellow,San。你最喜欢吃什么?万万没想到,你竟然喜欢吃Zhang
对于c++的字符串输入:cin使用空白(空格、制表符\t和换行符\n)来确定字符串的结束位置。因此在读取一行字符串输入时,要将整条短语而不是一个单词作为字符串输入,需要采取另一种字符串读取方法,具体地说,需要采用面向行而不是面向单词的方法(这也就是产生上述情况的原因)。istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,getline()将丢弃换行符,而get()将换行符保留在输入序列中。例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以使用这样的函数调用:
cin.getline(name,20);
对于代码2.1修改为cin.getline(),其他代码不变,姓名输入:“SanZhang”,食物:“Pepper”得到的结果如下所示
你好,我的名字是iDoit!你的名字是?SanZhanghellow,SanZhang。你最喜欢吃什么?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()函数。