C语言学习,这一篇就够了!(二)
3. 数组
数组是一组具有==相同类型==的数据的集合,这些数据称为==数组元素==。
3.1 一维数组
格式为:类型符 数组名[常量表达式]
。数组的所占字节数为元素个数与基类型所占字节数的乘积。
3.1.1 一维数组的初始化
三种方式
int array[5] = {1,2,3,4,5}
int array[] = {1,2}
int array[2]; a[0] = 1;a[1]=2;
注意:
- 下标从0开始
- 数组内元素的个数不能大于声明的数组长度
- 当元素个数小于数组的长度时,多余的数组元素初始化为0
3.1.2 引用一维数组元素
数组元素可以通过数组名称加索引进行访问,格式为:数组名[下标]
int a = b[1];
3.1.3 遍历一维数组
通过循环的方式可以写入和访问数组元素,而不用人为的每次获取指定某个位置上的元素
#include <stdio.h>
int main()
{
int i, a[10];
for (i = 0; i <= 9; i++)
{
a[i] = i;
}
for (i = 9; i >= 0; i--)
{
printf("%d ", a[i]);
}
return 0;
}
上面的程序实现了给数组a
赋值0-9,再按照下标大到小输出这10个元素
注意:
- 避免数组越界访问,循环变量
i
不要超过数组的长度 - C语言中不存在
length
方法:cry:,需要通过sizeof
来计算数组长度
int length = sizeof(arr) / sizeof(arr[0])
3.1.4 利用数组输出斐波那契数列
输出斐波那契数列的前20项,每5个换行
#include <stdio.h>
int main()
{
int i;
int f[20] = {1, 1}; //斐波那契数列前两位赋初值
for (i = 2; i < 20; i++)
{
f[i] = f[i - 2] + f[i - 1];
}
for (i = 0; i < 20; i++)
{
if (i % 5 == 0)
{
printf("\n");
}
printf("%d ", f[i]);
}
return 0;
}
输出:
3.2 二维数组
多维数组中最简单的就是二维数组,二维数组有两个下标,用来确定它在数组中的位置。二维数组可以被认定为是一个由行列组成的方阵,但是在内存中是线性的,按行依次来进行存放
格式为:类型说明符 数组名[常量表达式] [常量表达式]
3.2.1 二维数组的初始化
第一种
int num[2][3] = {{1,2,3},{4,5,6}};
第二种
int num[2][3];
num[1][1] = 2;
第三种
int a[2][3] = {1,2,3,4,5,6}
注意:
- 由于系统会根据数组中元素的总个数来分配空间,所以当知道元素总个数以及列的维数后,会计算出行的维数
- 二维数组定义时可以不指定行,但是一定要指定列
3.2.2 引用二维数组元素
格式为:数组名[下标] [下标]
如:a[1][2]
注意:
- 数组元素可以出现在表达式中,可以被赋值
b[1][2] = a[2][3]/2
- 在引用数组元素时,下标应在已经定义的数组大小的范围内
int a[3][4],但是不存在a[3][4]元素噢~
3.2.3 遍历二维数组
遍历二维数组采用的方式是双重for
循环,变量i
用来遍历行,j
用来遍历列
#include <stdio.h>
int main()
{
int num[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d", num[i][j]);
}
}
}
3.2.3 练习题
第一题
#include <stdio.h>
int main()
{
int i;
int x[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for(i = 0;i<3;i++) {
printf("%d ",x[i][2-i]);
}
}
上面程序的输出结果是
A、1 5 9 B、1 47 C、3 5 7 D、3 6 9
==答案:C==
第二题
以下能正确定义数组并正确赋初值的语句是______。
A、
int N=5,b[N][N]
;B、
int a[1][2]={{1},{3}}
;C、
int c[2][]={{1,2},{3,4}}
;D、
int d[3][2]={{1,2},{3,4}}
;
==答案:D==
3.3 字符数组
在C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。
我们把用来存放字符数据的数组称为==字符数组==,数组中的每一个元素内存放着==一个字符==
3.3.1 字符数组初始化
char 字符串名称[长度] = "字符串"
char 字符串名称[长度]= {'字符','字符'}
注意:
[]
中的长度可以省略不写- 采用第二种方式定义数组,最后一个元素必须为
\0
- 如果初值个数小于数组长度,则后面自动补为
\0
,\0
为字符串结束的标志
3.3.2 遍历输出字符数组中的元素
#include <stdio.h>
int main()
{
char c[] = "I am ljc";
for (int i = 0; i < sizeof(c) / sizeof(c[0]); i++)
{
printf("%c", c[i]);
}
return 0;
}
先定义一个字符数组,然后通过for循环来访问输出字符数组中的字符
3.3.3 字符串的结束符
-
在存储字符串时,系统会自动在其尾部加上一个空值
\0
,同时要占用一个字节,因此字符串ljc
需要占四个字节。 -
因此字符数组的大小要比它将要实际存放的字符串多一个元素,用来存放
\0
char c[] = "i am\0 ljc";
printf("%s\n",c);
由于\0
为字符串的结束标志,在输出字符串数组时遇到\0
就会停止输出,因此只会输出i am
3.3.4 字符串的输入输出
- 逐个字符输入输出,采用格式符
%c
输入或输出一个字符 - 将整个字符串输入输出,采用
%s
格式符,如printf("%s\n",c);
注意:
- 输出的字符中不包括
\0
- 通过
%s
输出时,输出表列填写的==是数组名称,而不是数组元素== - 遇到第一个
\0
就结束 - 在采用scanf输入字符串时,直接使用数组名称,==不需要采用取地址符==,因为数组名代表了数组的起始地址
==特别注意==
char str[13];
scanf("%s",str);
对于上面的代码,当输入i am ljc
时,只会把i
存入数组当中。这是因为系统把空格当作了字符串之间的分隔符
3.3.5 练习题
若有定义和语句:
则结果是(以下u代表空格) ______。
A、输出abcd B、输出a
C、输出abcduuuuu D、编译不通过
char s[10];
s = "abcd";
printf("%s\n",s);
==答案:D==
3.4 字符串处理函数
在使用之前需要引入头文件string.h
序号 | 作用 |
---|---|
strcpy(s1, s2); |
复制字符串 s2 到字符串 s1。 |
strcat(s1, s2); |
连接字符串 s2 到字符串 s1 的末尾。 |
strlen(s1); |
返回字符串 s1 的长度。 |
strcmp(s1, s2); |
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
strchr(s1, ch); |
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
strstr(s1, s2); |
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
3.4.1. strcat函数
字符串连接函数,它的作用是把两个字符数组中的字符串连接起来
使用方法
strcat(字符数组1,字符数组2)
下面程序输出i am ljc i am 18
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "i am ljc ";
char str2[] = "i am 18";
printf("%s",strcat(str1,str2));
}
3.4.2. strcpy函数
字符串复制函数,作用是将字符串2复制到字符数组1中
使用方法
strcpy(字符数组1,字符数组2)
输出:china
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "ljc";
char str2[] = "china";
printf("%s",strcpy(str1,str2));
}
该方法会覆盖原来的字符串,并且不能拷贝字符串常量
注意:可以使用strncpy
函数来指定复制字符串的字符数,例如strncpy(str1,str2,2)
,作用是将str2
中的前2个字符复制到str1
中原有的前两个字符,
==输出:chinajc==
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "nameljc";
char str2[] = "china";
printf("%s",strncpy(str1,str2,5));
}
3.4.3. strcmp函数
字符串比较函数,作用是比较字符串1和字符串2
比较的规则:将两个字符串自左向右逐个字符按照ASCII码值大小比较,直到出现不同的字符或者遇到\0
结束
- 如果全部字符相同则认为两个字符串相等
- 若出现不相同的字符,则以第一对不相同的字符的比较结果为准
比较结果由函数值带回
- 如果字符串1和字符串2相同,则函数值为0
- 如果字符串1大于字符串2,则函数值为1个正整数
- 如果字符串1小于字符串2,则函数值为1个负整数
使用方法
下面的程序输出1,表示字符串1小于字符串2
#include<stdio.h>
#include <string.h>
int main() {
char str1[] = "nameljc";
char str2[] = "china";
printf("%d",strcmp(str1,str2));// 1
}
3.4.4. strlen函数
测字符串长度的函数,作用是检测字符串长度
使用方法
strlen(str)
输出:5,可见输出的是字符串的实际长度,不包括\0
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "china";
printf("%d",strlen(str));
}
3.4.5. strlwr函数
将大写转换为小写的函数
使用方法
strlwr(字符串)
输出:ljc
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "LJC";
printf("%s",strlwr(str));
}
3.4.6. strupr函数
将小写转换为大写的函数
使用方法
strupr(字符串)
输出:I AM LJC
#include<stdio.h>
#include <string.h>
int main() {
char str[] = "i am ljc";
printf("%s",strupr(str));
}
3.4.7 练习题
函数调用:strcat(strcpy(str1,str2),str3)的功能是______。
A、将串str1复制到串str2中后再连接到串str3之后
B、将串str1连接到串str2之后再复制到串str3之后
C、将串str2复制到串str1中后再将串str3连接到串str1之后
D、将串str2连接到串str1之后再将串str1复制到串str3中
答案:C
博主累了,码了几天,已经码了上万字了,自己也是一边复习一边整理,感觉还不错噢,相信你也一定能够学到很多噢!
- 点赞
- 收藏
- 关注作者
评论(0)