导图社区 C语言数组
这是一篇关于C语言数组的思维导图,包括一维数组、二维数组和字符串数组,字符串常量,字符串处理函数等内容。
编辑于2021-07-29 17:54:07C语言数组
一维数组
定义一维数组
类型符 数组名[常量表达式]
int student[10];
数组名的命名规则和变量名相同,遵循标识符命名规则。
在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,在定义时定义 student[10],表示数组 student[] 有 10 个元素。注意,下标是从 0 开始的,这 10 个元素分别是 student[0]...student[9]。一定要注意这里面不会有 student[10]。
常量表达式中可以包括常量和符号变量,如 int a[4*2] 是合法的。但是不能包括变量,如下面的就是不合法的:
int n; scanf("%d",&n); int b[n];
一维数组的初始化
在定义数组时对全部数组元素赋予初值
int a[10] = {0,1,2,3,4,5,6,7,8,9};
给数组中的部分元素赋值
int a[10] = {0,1,2,3};
花括号内只给了 4 个初值, 这表示只给前 4 个元素赋初值, 其余元素系统自动给其赋初值为 0。
示例
/* 冒泡排序方法*/ #include<stdio.h> int main() { int i; int j; int t; int LearnTime[5]; printf("Please enter 5 number: \n"); for(i = 0; i < 5; i++) { scanf("%d", &LearnTime[i]); } // 冒泡排序算法 for(j = 0; j < 4; j++) { for(i = 0; i = 4 - j; i++) { if(LearnTime[i] > LearnTime[i+1]) { t = LearnTime[i]; LearnTime[i] = LearnTime[i+1]; LearnTime[i+1] = t; } } } printf("the sorted number:\n"); for(i = 0; i < 5; i++) { printf("%d\t", LearnTime[i]); } return 0; }
一个循环冒一个 8
7
二维数组
定义二维数组
类型说明符 数组名[常量表达式][常量表达式]
float a[3][4];
存放顺序
C 语言中,二维数组在内存中存放的顺序是按行存放的,即在内存中先顺序存放第一行元素,接着再来存放第二行元素。
假设数组存放是从 2000 开始的, 一个元素占用 4 个字节,下图就是 a[3][4] 在内存中存放的具体形式。
赋值顺序
分行给二维数组赋初值
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
可以将所有的数据放在一个花括号内
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
可以对部分元素赋初值
int a[3][4]={{1},{3},{5}};
1 0 0 0 3 0 0 0 5 0 0 0
示例
有一个 3*4 的矩阵,求出其中的最大值并输出最大值和其所在的行号和列号。
我们本题目也采用打擂台算法。先让 a[0][0] 做“擂主”, 把它的值赋给变量 max,max 用来存放当前已知的最大值, 在开始时还未进行比较,把最前面的元素认为是当前最大值, 然后让下一个元素 a[0][1] 和 max 比较,如果 a[0][1]>max, 则把 a[0][1] 赋值给 max,取代 max 的原值。以后以此处理, 直到全部比完之后,max 就是最大值。
#include<stdio.h> int main() { int i; int j; int row = 0; int column = 0; int max; int a[3][4] = {{3,4,16,2},{7,5,1,9},{11,23,3,8}}; // 设置擂主 max = a[0][0]; for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) { if (a[i][j] > max) { max = a[i][j]; row = i; column = j; } } } printf("max=%d\nrow=%d\ncolumn=%d\n", max, row, column); return 0; }
字符串数组
字符型数据是以字符的 ASCII 代码存储在存储单元中的,一般占一个字节。由于 ASCII 代码属于整数形式,因此,把字符型归纳为整数类型中的一种。
C 语言中没有字符串类型,字符串都是存储在字符型数组中的。
字符数组的定义
char c[10];
以上就定义了 c[] 为字符数组,包含 10 个元素。
字符数组的初始化
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
上面例子中花括号提供的初值个数(即字符个数)等于数组长度, 倘若花括号中的提供初值个数大于数组长度,则会出现语法错误。 倘若初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素, 其余元素自动定为空字符(即'\0')
char c[10]={'I',' ','l','o','v','e',' ','c'};
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
数组 c[] 的长度自动定为 10。这种方式不用人工去数字符的个数,尤其在赋初值字符个数比较多的情况下,比较方便。
char c[] = {"I love shiyanlou"};
char c[] = "I love shiyanlou";
此时数组的长度是 17,而不是 16,因为字符串常量的最后系统自动加了一个 '\0'。上面的初始化与下面的初始化等价的。
char c[] = {'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'};
示例: 输出一个正方形 先画出一个平面正方形图案, 每行包含 5 个字符, 其中有的是空白字符,有的是 '*' 字符,定义一个字符型的二维数 组并初始化,用 for 循环嵌套输出。
#include<stdio.h> int main() { char c[][9] = { {'*',' ','*',' ','*',' ','*',' ','*'}, {'*',' ',' ',' ',' ',' ',' ',' ','*'}, {'*',' ',' ',' ',' ',' ',' ',' ','*'}, {'*',' ',' ',' ',' ',' ',' ',' ','*'}, {'*',' ','*',' ','*',' ','*',' ','*'}, }; int i; int j; for(i = 0; i < 5; i++) { for(j = 0; j < 9; j++) { printf("%c", c[i][j]); } printf("\n"); } return 0; }
* * * * * * * * * * * * * * * *
C 语言中,二维数组初始化的语句中可以不指定行数进行初始化, 比如 char c[ ][9] 就省略了行数,编译器自动将其识别为 char c[5][9]
字符串和字符串结束标志
C 语言规定了一个“字符串结束标志('\0')”,以字符 '\0' 作为结束标志。
如果字符数组中存在若干字符,前面 9 个字符都不是空字符('\0'), 而第 10 个字符是 '\0',则认为数组中有一个字符串,其有效字符为 9 个。 系统在用字符数组存储字符串常量时会自动加一个 '\0' 作为结束符。
字符数组的输入输出
逐个字符输入输出,用格式“%c”输入或者输出一个字符
将整个字符串一次输入或者输出,用“%s”格式符
char c[] = "shiyanlou"; printf("%s", c); //用%s格式符输入或输出字符串时,接受项是字符数组名
puts 和 gets函数
puts(字符数组):其作用是将一个字符串输出到终端,因此该函数用的不是很多,我们可以编写小程序来体验。
gets(字符数组):其作用是从终端输入一个字符串到字符数组,并且得到一个函数值
在使用字符串处理函数时
#include<string.h>
示例
#include<stdio.h> #include<string.h> int main() { char str[] = "China\nChengdu"; puts(str); printf("enter a new string:"); gets(str); puts(str); return 0; }
使用字符串处理函数
字符串连接函数
strcat 函数
strcat(字符数组 1,字符数组 2)
把字符串 2 接到 1 后面,结果放到字符串 1 中。
示例
#include<stdio.h> #include<string.h> int main() { char str1[30] = "People's Repunlic of'"; char str2[] = "China"; printf("%s", strcat(str1, str2)); return 0; }
People's Repunlic of'China
连接前两个字符串后面都有 '\0',连接时将字符串 1 后面的 '\0' 取消,只在新串后面保留 '\0'。
字符串 1 必须足够大,以便于容纳字符串 2。如果在定义是定义为 char str1[]="People's Republic of"; 就会出现问题,因为长度不够。
测字符串长度的函数
strlen 函数
strlen(字符数组)
它是测量字符串长度的函数。函数的值为字符串中的实际长度。
strlen() 返回的值比实际占用的长度要小,因为不包含 '\0'。
字符串复制函数
strcpy函数
strcpy(字符串 1,字符串 2)
作用是将字符串 2 复制到字符串 1 中
示例
char str1[10],str2[] = "China"; strcpy(str1,str2);
字符数组 1 必须定义的足够大,以便容纳被复制的字符串 2。
“字符数组 1” 必须写成数组名形式(如 str1),“字符串 2”可以使字符数组名, 也可以是一个字符串常量。例如:strcpy(str1,"China"); 作用与前面的相同。
不能用赋值语句将一个字符串常量直接给一个字符数组。如下面两行是错误的
str1 = "shiyanlou"; //错误,企图用赋值语句将一个字符串常量直接赋值给一个数组 str1 = str2; //错误,企图用赋值语句将一个字符数组直接赋给另一个字符数组
字符串比较函数
strcmp函数
strcmp(字符串 1,字符串 2)
它的作用是比较字符串 1 和字符串 2
示例
strcmp(str1,str2); strcmp("Chengdu","Beijing");
比较规则
将两个字符串自左向右逐个字符比较(按照 ASCII 码值大小比较),直到出现不同的字符或者遇到 '\0 '为止。 如果全部字符相同,则认为两个字符串相同。 若出现不同的字符,则以第 1 对不相同的字符的比较结果为准。 例如:"A"<"D","e">"E","these">"that","computer">"compare"。 比较结果由函数值带回。 字符串 1=字符串 2,则函数值为 0 字符串 1>字符串 2,则函数值为一个正整数 字符串 1<字符串 2,则函数值为一个负整数
转换为小写的函数
strlwr 函数
转换为大写的函数
strupr函数