数组先定义,再使用;
实例:int a[3]; //定义了一个数组,数组名是‘a’,包含3个元素,每个元素是int类型的变量。
特点:这3个变量是连续存储在内存中的。
注:数组的下标是从0开始,不是从1开始。
a[0]→a[1]→a[2];
注:a[3]是错误的,数组越界。
越界的结果:编译器不作任何检查,可能导致数据破坏
数组的初始化
在定义数组的同时,设置数组内的元素值。
int a[3] = {10, 20, 30};
printf("%d,%d,%d", a[0], a[1], a[2]);
或者
cout << a[0] << a[1] << a[2] << endl;
int a[3] = {0};//数组元素的值都初始化为0
int b[] = {3, 10, 20};//等效于:int b[3]
//在定义时,仅定义了部分成员
//乱序方式,不是连续方式
//注意:仅C编译器支持该方式,C++编译器不支持
int scores[50] = {
[15] = 30,
[8] = 40,
[25] = 222,
};
//另类用法:使用下标的方式访问string字符串
string name = "Rock";
//name[i]是string字符串中的第i个字符(char类型)
for(int i=0; i < name.length(); i++)
{
cout << name[i];
}
name[0] = 'L';//name变成:Lock
例:
char n[] = {"Rock"};//等价于:'R' 'o' 'c' 'k' '\0'
printf("%d", sizeof(n));//5
char addr[30];
scanf("%s", addr);
//清空输入缓冲区
fflush(stdin);
gets(addr);//读一行,直到遇到回车符
printf("%s", addr);
英语:string 字符串;length 长度;scanf 输入函数
常见错误:
error1:cin.sync();在VS中失效!
cin.sync()是清空缓冲区,但是实际的实现取决于编译器,但是使用vc++或者g++编译器,是可以的;
使用自定义的clearBuff();
以及getchar()的剖析
if(cin.fail())
{
cin.clear();
//cin.sync();
clearBuff(); // char number; while((number = getchar()) != '\n');
}
getchar()函数实际上是int getchar(void),所以它返回的是ASCII码,所以只要是ASCII码表里有的字符它都能读取出来。在调用getchar()函数时,编译器会依次读取用户输入缓存区的一个字符(注意这里只读取一个字符,如果缓存区有多个字符,那么将会读取上一次被读取字符的下一个字符),如果缓存区没有用户输入的字符,那么编译器会等待用户键入并回车后再执行下一步 (注意输入后的回车键也算一个字符,输出时直接换行)。
回车也算一个字符,所以如果在前面先要调用scanf()这种读取字符的函数后再输入新值调用getchar()(因为想要scanf()调用必须回车才能执行,就多了一个回车在缓存区中),建议清空缓存区再使用getchar(),不然getchar()会把前面回车也读取出来。注:可以使用fflush(stdin)清空缓存区(有的编译器用不了)
getchar()在使用时,大多数出错就是对于回车字符的读取。注意在调用前清空缓存区会是很好的解决办法。所以scanf()的优点就体现出来了,scanf()只有在格式化为"%c"时会读取回车符,但缺点也是无法读取含空格等字符的字符串并存储到字符数组中(严格意义上讲并不是字符串,可以理解为含格式化"%s"无法完整读取的字符组合,例如"gy gr 134 4353freg 32"这种中间有空格的)
error2:
int a[3];
a={ 1, 2, 3};//错误
a[3] = 100;//错误
error3:
string s;
s = 3.14*100;//错误,类型不匹配
断点调试:
逐语句:一条一条语句条条
逐过程:函数直接跳出