一、数组
1.一维数组
假如我们需要定义1000个变量怎么办?
C语言提供了一个方便的方式数组
数组定义
type arrayName [ arraySize ];
如:
double balance[10];
数组初始化
int a[3] = {1,2,3};
访问数组
a[0] = 1;
printf(“%d”,a[1]);
char array[3]={‘a’,‘b’,‘c’}; //要用单引号
char a[] = {‘1’,‘2’,‘3’,‘4’};
printf("%c\n",array[2]);
printf("%c\n",a[2]);
数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。
2.多维数组
多维数组
简单理解,
二维数组就是有多少个一维数组,三维数组就是有多少个二维数组。
四维数组就是有多少个三维数组。
…以此类推
二维数组
int a[2][3];
三维数组
int a[3][3][3];
四维数组
int a[3][3][3][3];
一般使用最多的是一维数组和二维数组
数组定义示例:
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int i,j;
printf("%d\n",a[1][2]);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%2d",a[i][j]);
}
printf("\n");
}
}
二、字符串
1.字符串数组(字符串)
字符数组实际上是一系列字符的集合,也就是字符串(String)。在 C 语言中,没有专门的字符串变量,没有 string类型,通常就用一个字符数组来存放一个字符串。
C 语言规定,可以将字符串直接赋值给字符数组,例如
char str[20] = { "hello,world" };
char str[20] = "hello,world"; //这种形式更加简洁,实际开发中常用
数组第 0 个元素为’h’,第 1 个元素为’e’,第 2 个元素为’l’,后面的元素以此类推。
为了方便,你也可以不指定数组长度,从而写作:
char str[] = { "hello,world" };
char str[] = "hello,world"; //这种形式更加简洁,实际开发中常用
给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。
千万要注意:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字
符一个字符地赋值了。请看下面的例子:
char str[7];
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
字符串结束标志(划重点):
在 C 语言中,字符串总是以’\0’作为结尾,所以’\0’也被称为字符串结束标志,或者字符串结束符。
\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在 C 语言中唯一的作用就是作为字符串结束标志。
需要注意的是,逐个字符地给数组赋值并不会自动添加’\0’,例如:
char str[] = {'a', 'b', 'c'};
数组 str 的长度为 3,而不是 4,因为最后没有’\0’。
当用字符数组存储字符串时,要特别注意’\0’,要为’\0’留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:
char str[7] = "abc123";
abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的’\0’。如果将 str 的长度定义为 6,它就无法容纳’\0’了。
操作示例:
#include <stdio.h>
int main()
{
char a[]="abc123"; //自动添加 '\0'在末尾
char b[]={'a','b','c','1','2','3'};
printf("a[]_size:%d\n",sizeof(a));
printf("b[]_size:%d\n",sizeof(b));
return 0;
}
2.字符串的输入和输出
字符串的输出
在 C 语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是:
puts():输出字符串并自动换行,该函数只能输出字符串。
printf():通过格式控制符%s 输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。
字符串的输入
在 C 语言中,有两个函数可以让用户从键盘上输入字符串,它们分别是:
scanf():通过格式控制符%s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
gets():直接输入字符串,并且只能输入字符串。
但是,scanf() 和 gets() 是有区别的:
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。
3.字符串相关的函数
需要带入相关库的头文件
#include <stdio.h>
①复制函数 strcpy()
strcpy(arrayName1, arrayName2);
strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志’\0’也一同拷贝
示例代码:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "abc";
char str2[10] = "qwert";
strcpy(str1,str2);
printf("str1:%s",str1);
return 0;
}
注意:
将 str2 复制到 str1 后,str1 中原来的内容就被覆盖了。另外,strcpy() 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串
②字符串比较函数 strcmp()
strcmp(arrayName1, arrayName2);
返回值:若 arrayName1 和 arrayName2 相同,则返回 0;若 arrayName1 大于 arrayName2,则返回大于 0 的
值;若 arrayName1 小于 arrayName2,则返回小于 0 的值。
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abc";
char str2[] = "qwert";
char str3[] = "abc";
printf("vs:%d\n",strcmp(str1,str2));
printf("vs:%d\n",strcmp(str2,str1));
printf("vs:%d\n",strcmp(str1,str3));
return 0;
}
③字符串长度
所谓字符串长度,就是字符串包含了多少个字符(不包括最后的结束符’\0’)。例如"abc"的长度是 3,而不是 4。 在 C 语言中,我们使用 string.h 头文件中的 strlen() 函数来求字符串的长度,它的用法为:
length strlen(strname);
strname 是字符串的名字,或者字符数组的名字;length 是使用 strlen() 后得到的字符串长度,是一个整数。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "qwert";
int len;
len = strlen(str);
printf("The lenth of the string is %d.\n", len);
return 0;
}