数组
数组的下标:编译器不会检查使用的下标是否有效,但是可能会影响程序的运行,破坏数据或代码,也有可能导致程序异常终止。所以必须要确保程序只使用有效的下标值。
数组的初始化
- 第一种:
int array[3];
array[0]=7;
array[1]=9;
array[2]=8;
- 第二种(初始化列表)
int array[3]={7,9,8};
初始化规则
部分初始化:编译器会将其他元素设置为0
在C++11中:初始化数组,可省略等号;
当使用初始化列表时,可不在大括号内包含任何东西,这将所有元素都设置为0;
列表初始化禁止缩窄转换,即数组的类型和数组元素的类型要一致
字符串
在c语言中,字符串以空字符结尾(‘\0 ’)。
字符串是存储在内存的连续字节中的一系列字符。
c语言中有:
/*字符数组*/
char cat[8]={'f','a','t','c','a','e','t','\0'};
/*字符串常量*/
char cat[11]="bubbles";
字符串常量隐式的包括了结尾的空字符
字符串常量与字符常量不能进行互换:
如”S”和‘S’
"S" 表示两个字符('S'和'\0')组成的字符串;
'S' 表示一个字符S。换成ASCII为83;
拼接字符串常量
任何两个由空白(空格,制表符,换行符)分隔的字符串常量都将自动拼接成一个;在拼接时不会在被连接的字符串之间添加空格。第二个字符串的第一个字符紧跟在第一个字符串的最后一个字符(不考虑\0),第一个字符串中的\0字符被第二个字符的第一个字符取代。
在数组中使用字符串
要将字符串存储在数组中,有两种办法:
- 将数组初始化为字符串常量
- 将键盘或文件输入读到数组中
sizeof():返回的是整个数组的长度
strlen():返回的是存储在数组中的字符串的长度,而不是数组本身的长度;不计算空字符。
c++中,cin通过空白(空格,制表符,和换行符)来确定字符串的结束位置。【在输入的时候应注意!!!】
每次读取一行字符串输入
istream中的类如cin提供了面向行的类成员函数:
1. getline()
它通过回车键键入的换行符来确定输入结尾。但不保存换行符,在存储字符时,会用空字符来替换换行符;
调用方法:cin.getline(para1,para2);
para1:第一个参数是用来存储输入行的数组的名称
para2:第二个参数是要读取的字符数。若参数为20,最多能读取19个字符;余下的自动存储在结尾处添加的空字符。
2. get()
get不会丢弃换行符,而是将其留在输入队列中。
cin.get()可可读取下一个字符(即使是换行符)
cin.get(name,20);
cin.get(dma,20);
在第一次调用后,换行符留在了输入队列中,第二次调用时的第一个字符就是换行符,因此get()认为已经达到队尾,而没有发现任何可读取的内容。所以正确的调用顺序应为:
cin.get(name,20);
cin.get();
cin.get(dma,20);
另外的一种get()的方式是:
cin.get(name,20).get(); /*自己本身也不大理解*/
当get()读取空行后,会设置失效位,意味着接下来的输入将被阻断,需要用:
cin.clear() 来恢复输入。
待解决问题:输入字符串可能比分配的空间长,如果输入行包含的字符数要比指定的多,则以上两个函数都会将余下的字符留在输入队列中,而getline()会设置失效位,并关闭了后面的输入【学到后面后来解决】