文章目录
目录
前言
今天,我开始学习C语言中的字符数组和二维数组。字符数组是用于存储字符串的基本数据结构,它可以用来存储和处理字符串数据。而二维数组则可以看作是一个表格,由行和列组成,适合用来处理矩阵、图像等数据。因此,我计划通过一系列的学习和实践,来深入理解字符数组和二维数组的定义、初始化、输入输出操作以及常用的字符串处理函数。
一、字符数组
1.1.字符数组的定义
char c[10];
类型说明符 数组名[常量表达式]:
由于字符型与整型是互相通用的,因此也可以定义一个整型数组,用它存放字符数
据,例如:
int c[10];
c[0]='a';/*合法,但浪费存储空间*/
int型每个占4字节,char型每个占1个字节。因此,存放相同数量的元素时int型会浪费存储空间
1.2字符数组的初始化
字符数组的初始化有下面几种方式:
1.2.1逐个字符赋给数组中各元素
char c[10]={'I','a','m','h','a','p','p','y'};
1.2.2省略数组长度
char c[]={'I','a','m','h','a','p','p','y'};
定义时忽略数组长度,系统会自动根据初值个数确定数组长度。
1.2.3最常用的初始化方式
char c[] = "I am happy";
1.3字符串和字符串结束标志
在C语言中,是将字符串作为字符数组来处理的。C语言规定了一个“字符串结束标志”,以字符'\0'作为标志。系统对字符串常量也自动加一个'\0'作为结束符。
说明:\0'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
1.4字符数组的输入输出
1.4.1 gets函数
gets(s);
使用gets函数时要注意越界风险,gets函数不会计入换行符
1.4.2 fgets函数
fgets(s ,sizeof(s),stdio);
stdio为标准输入设备(键盘)。
1.4.3 scanf函数
scanf("%s", s);
1.4.4 puts函数
puts(s);
puts函数自带换行符。
1.4.5 printf函数
printf("%s\n", s);
1.4.6 putchar函数
for (i = 0; s[i] != '\0'; i++) {
putchar(s[i]);
}
1.5字符串处理函数
在C函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C语言编译系统都提供这些函数。下面介绍几种常用的函数。
1.5.1strlen函数(数组长度)
1 #include<stdio.h>
2
3 int main(void)
4 {
5 char s[10] = "hello";
6 int i = 0;
7 int count = 0;
8 while(s[i] != '\0')
9 {
10 ++count;
11 ++i;
12 }
13 printf("%d\n", count);
14 return 0;
15 }
等价于
strlen(s);
strlen函数只计算有效字符,sizeof函数吧‘\0’计算在内。
1.5.2strcpy函数(复制)
1 #include<stdio.h>
2
3 int main(void)
4 {
5 char s1[100];
6 char s2[100];
7 int i = 0;
8 gets(s1);
9 while(s1[i] != '\0')
10 {
11 s2[i] = s1[i];
12 ++i;
13 }
14 s2[i] = '\0';
15 puts(s2);
16 return 0;
17 }
等价于
strcpy(目标数组,源数组);
1.5.3strcat函数(拼接)
1 #include<stdio.h>
2 #include<string.h>
3 int main(void)
4 {
5 char s1[100] = "Hello,";
6 char s2[100] = "World!";
7 int j = 0;
8 int i = 0;
9 int len = strlen(s1);
10 while(s1[i] != '\0')
11 {
12 ++i;
13 }
14 while(s2[j] != '\0')
15 {
16 s1[i] = s2[j];
17 ++j;
18 ++i;
19 }
20 s1[i] = '\0';
21 puts(s1);
22 return 0;
23 }
等价于
strcat(目标数组,源数组);
1.5.4strcmp函数(比较)
#include <stdio.h>
int main() {
char str1[] = "hello";
char str2[] = "world";
int i = 0;
while (str1[i] != 0 && (str1[i] == str2[i]) && str2[i] != 0)
{
i++;
}
int result = str1[i] - str2[i];
printf(" %d", result);
return 0;
}
等价于
strcmp(s1,s2);
其本质是对字符的ACSII码做比较,返回值为两个字符数组的首对不同字符的ACSII码差值
1.6字符数组应用举例
下面是一个逆序输出字符数组的代码示例:
1 #include<stdio.h>
2 #include<string.h>
3
4 int main(void)
5 {
6 char s1[100] = "Hello";
7 int len = strlen(s1);
8 int i = 0;
9 for (i = 0;i < len / 2;++i)
10 {
11 char temp = s1[i];
12 s1[i] = s1[len - 1 - i] ;
13 s1[len - 1 - i] = temp;
14 }
15 puts(s1);
16 return 0;
17 }
二、二维数组
2.1二维数组的定义
二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式];
f1oat a[3][4],b[5][10];
2.2二维数组的引用
二维数组元素的表示形式为
数组名 [下标][下标]
2.3二维数组的初始化
可以用下面的方法对二维数组初始化。
(1)分行给二维数组赋初值。例如:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号
内的数据赋给第2行的元素…即按行赋初值。
(2)可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。例如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
对于初值小于有效值的情况,自动补0。
(3)可以对部分元素赋初值。例如:
int a[3][4]={1},{5},{9}};
它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。
二维数组只能省略行数不能省略列数
2.4二维数组程序举例
下面是计算一个二维数组的边缘元素的平均值示例代码:
1 #include<stdio.h>
2
3 int main()
4 {
5 int a[3][5] = {{1,2,3,4,5},{1,2,3,6,7,},{1,2,3,8,9}};
6 double sum = 0;
7 int rows = sizeof(a) / sizeof(a[0]);
8 int cols = sizeof(a[0]) / sizeof(a[0][0]);
9 int i,j;
10 for(i = 0;i < rows;++i)
11 {
12 for(j = 0;j < cols;++j)
13 {
14 if(0 == j || 0 == i || j == cols - 1 || i == rows - 1)
15 {
16 sum += a[i][j];
17 }
18 }
19 }
20 sum = sum / (double)(rows * cols);
21 printf("%f\n",sum);
22 return 0;
23 }
三、二维字符数组
- 二维数组的镜像输出
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 6 int rows = sizeof(a) / sizeof(a[0]); 7 int cols = sizeof(a[0]) / sizeof(a[0][0]); 8 int j ,i; 9 for(i = 0; i < rows;++i) 10 { 11 for(j = 0;j < cols / 2;++j) 12 { 13 int temp = a[i][j]; 14 a[i][j] = a[i][cols - 1 - j]; 15 a[i][cols - 1 - j] = temp; 16 } 17 } 18 for(i = 0; i < rows;++i) 19 { 20 for(j = 0;j < cols;++j) 21 { 22 printf("%4d",a[i][j]); 23 } 24 printf("\n"); 25 } 26 return 0; 27 }
- 二维字符数组的比较
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(void) 5 { 6 char s[][100] = {"Hello","World","China","America"}; 7 char max[100] ; 8 int rows = sizeof(s) / sizeof(s[0]); 9 strcpy(max,s[0]); 10 int i = 0; 11 for(i = 1; i < rows;++i) 12 { 13 14 if(strcmp(s[i] , max) > 0) 15 { 16 strcpy(max, s[i]); 17 } 18 } 19 puts(max); 20 return 0; 21 }
3.二维字符数组的查找
1 #include<stdio.h>
2 #include<string.h>
3 int main(void)
4 {
5 char s[][100] = {"Hello","World","China","America"};
6 char room[100];
7 char m[100] = "Hello";
8 int rows = sizeof(s) / sizeof(s[0]);
9 int i = 0;
10 int j = 0;
11 for(j = rows - 1;j > 0;--j)
12 {
13 for(i = 0 ; i < j;++i)
14 {
15 if(strcmp(s[i],s[i + 1]) > 0)
16 {
17 strcpy(room , s[i]);
18 strcpy(s[i], s[ i + 1]);
19 strcpy(s[i + 1], room);
20 }
21 }
22 }
23 int begin = 0;
24 int end = rows - 1;
25 int mid;
26
27 while(begin <= end)
28 {
29
30 mid = (begin + end) / 2;
31 if(strcmp(s[mid],m) > 0)
32 {
33 end = mid - 1;
34 }
35 else if( strcmp(s[mid],m) < 0)
36 {
37 begin = mid +1;
38 }
39 else
40 break;
41 }
42
43 if(begin <= end)
44 {
45 printf("%d\n",mid);
46 }
47 else
48 {
49 printf("no\n");
50 }
51 return 0 ;
52 }
总结
在使用字符串处理函数时,注意加上头文件<string .h>,以及目标数组的空间是否足够。要区分strlen函数和sizeof函数对于字符数组的结果代表的不同含义。在写字符数组和二维数组程序时,一定防止出现越界访问的情况。对于字符串处理问题,在数组中间出现‘\0’时(即结束符后还有其他元素),C语言会把结束符与后面的元素进行拼接,力求字符数组中有尽可能多的有效值。