一维数组
数组就是具有一定顺序关系的若干变量的集合。其中的每个变量都被称为数组的元素,且数据类型必须相同。
dataType arry_name][len];
数组中每个元素的数据类型必须一致
数组长度 length 最好是整数或者常量表达式
访问数组元素时,下标的取值范围为 0 ≤ index < leng,过大或过小都会越界,导致数组溢出
arry_name[index]
数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙
数组的初始化
1 ) 可以只给部分元素赋值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。
2 ) 只能给元素逐个赋值,不能给数组整体赋值。
3 ) 如给全部元素赋值,那么在定义数组时可以不给出数组长度。
二维数组
dataType arry_name[len1][len2];
二维数组的各个元素是相互挨着的,彼此之间没有缝隙
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
//两种赋值方式等价
注意
1 )可以只对部分元素赋值,未赋值的元素自动取“零”值。
2 )如果对全部元素赋值,那么第一维的长度可以不给出
3 )二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。前提是各个元素的类型必须相同
字符数组和字符串详解
用来存放字符的数组称为字符数组
char a[10]; //一维字符数组
char b[5][10]; //二维字符数组
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
char str[30] = {"cyuyan"};
char str[30] = "cyuyan"; //这种形式更加简洁,实际开发中常用
char str[] = {"cyuyan"};
char str[] = "cyuyan"; //这种形式更加简洁,实际开发中常用
char str[7];//字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
字符串结束标志
找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以。字符串总是以'\0'作为结尾,所以'\0'也被称为字符串结束标志,或者字符串结束符。由" "包围的字符串会自动在末尾添加'\0'
字符串长度
即字符串包含了多少个字符(不包括最后的结束符'\0')
#include <string.h>
len = strlen(str_name)
字符串的输出
puts():输出字符串并自动换行,该函数只能输出字符串。
printf(): 通过格式控制符%s输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。
#include <stdio.h>
int main(){
char str[] = "abc";
printf("%s\n", str); //通过字符串名字输出
printf("%s\n", "abc"); //直接输出
puts(str); //通过字符串名字输出
puts("abc"); //直接输出
return 0;
}
执行结果:
abc
abc
abc
字符串的输入
scanf();//通过格式控制符%s输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
gets();//直接输入字符串,并且只能输入字符串。
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,即不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。
scanf()控制字符串
scanf() 控制字符串的完整写法为:
%{*} {width} type
其中,{ } 表示可有可无。各个部分的具体含义是:
type表示读取什么类型的数据,例如 %d、%s、%[a-z]、%[^\n] 等;type 必须有。
width表示最大读取宽度,可有可无。
*表示丢弃读取到的数据,可有可无。
字符串处理函数
string.h是一个专门用来处理字符串的头文件,它包含了很多字符串处理函数。下面三个是比较常用的。
字符串连接函数strcat()
strcat 是 string catenate 的缩写,即把两个字符串拼接在一起,格式为:
strcat(str1,str2);
str1,str2是需要拼接的字符串。strcat()将把str2连接到str1后面,并删除原来str1最后的结束标志'\0'。即str1必须足够长以同时容纳str1和str2,否则会越界。
strcat()返回值为str1的地址。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[]="Today is";
char str2[100]={0};
printf("input a weekday: ");
gets(str2);
strcat(str1,str2);
puts(str1);
return 0;
}
执行结果:
input a weekday: Friday↙
Today is Friday
字符串复制函数strcpy()
strcpy 是 string copy 的缩写,意思是字符串复制,即将字符串从一个地方复制到另外一个地方,格式为:
strcpy(str1,str2);
strcpy() 会把str2中的字符串拷贝到str1中,字符串结束标志'\0'也一同拷贝。所以str1的长度必须足够长以至能容纳str2的内容。
#include <stdio.h>
#include <string.h>
int main(){
char str1[50] = "abcde";
char str2[50] = "everyday is a new nice day";
strcpy(str1, str2);
printf("str1: %s\n", str1);
return 0;
}
执行结果:
str1: everyday is a new nice day
字符串比较函数strcmp()
strcmp 是 string compare 的缩写,意思是字符串比较。
strcmp(str1);
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。返回值:若str1和str2相同则返回0;若str1大于str2则返回大于0的值;若str1小于str2则返回小于0的值。
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "aBcDeF";
char b[] = "AbCdEf";
char c[] = "aacdef";
char d[] = "aBcDeF";
printf("a VS b: %d\n", strcmp(a, b));
printf("a VS c: %d\n", strcmp(a, c));
printf("a VS d: %d\n", strcmp(a, d));
return 0;
}
执行结果:
a VS b: 32
a VS c: -31
a VS d: 0