Lesson5 数组和字符串
5.数字和字符串
5.1 概述
数组的定义方式: 数据类型 数组名[元素个数] = {x1,x2,x3}
#include
int main()
{
int arr[10] = { 9,4,2,1,2,3,10,22,55,12 };
for (int i = 0; i < 10; i++)
{
printf("%d\t", arr[i]);
}
}
输出:9 4 2 1 2 3 10 22 55 12
5.2 数组的定义与使用
int main()
{
int arr[10] = { 9,4,2,1,5,3,10,22,55,12 };
//下标为0的元素地址
printf("%p\n", &arr[0]);
printf("%p\n", &arr[1]);
printf("%p\n", &arr[2]);
printf("%p\n", &arr[3]);
printf("%p\n", &arr[4]);
printf("%p\n", &arr[5]);
printf("%p\n", &arr[6]);
printf("%p\n", arr);//数组名是一个地址常量 指向数组首地址的常量
printf("数组在内存中占得大小:%d\n", sizeof(arr));//数组名是一个地址常量 指向数组首地址的常量
printf("数组元素的个数:%d\n", sizeof(arr)/sizeof(arr[0]));
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d\n", arr[i]);
}
{
}
return 0;
}
输出:
00D3F874
00D3F878
00D3F87C
00D3F880
00D3F884
00D3F888
00D3F88C
00D3F874
数组在内存中占得大小:40
数组元素的个数:10
9
4
2
1
5
3
10
22
55
12
数组下标元素必须是常量,或者常量表达式
如果一开始用int i =5; arr[i],这样定义是不可以的
数组下标越界可能会报错,越界之后读取的就是内存中的数据,如果数据是不可以访问的,就会报错
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[-1]);
for (int i = 0; i < 20; i++)
{
printf("%d\n", arr[i]);
//数组下标越界
}
return 0;
}
输出:
-858993460
1
2
3
4
5
6
7
8
9
10
-858993460
2489552
4138131
1
7826608
7828632
1
7826608
7828632
2489644
十只小猪称体重:
#define _CRT_SECURE_NO_WARNINGS
#include
#define SIZE 10
int main() {
int arr[SIZE];
for (int i = 0; i < SIZE; i++)
{
scanf("%d", &arr[i]);
}
int max = 0;
for (int i = 0; i < SIZE; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("最重的小猪体重为:%d\n", max);
return 0;
}
可以输出最大的那个数
冒泡排序:每次比较次数为元素个数-1-执行次数
#include
int main()
{
int arr[] = { 9,1,5,7,2,10,8,4,6,3 };
for (int i = 0; i < 10-1; i++)//外层控制行
{
for (int j = 0; j < 10-1-i; j++)//内层控制列
{
if (arr[j] > arr[j + 1]) {//交换两个元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\t", arr[i]);
}
return 0;
}
输出:1 2 3 4 5 6 7 8 9 10
5.3二维数组
#include
int main()
{
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf("二维数组大小为:%d\n", sizeof(arr));
printf("二维数组一行大小为:%d\n", sizeof(arr[0]));
printf("二维数组元素大小为:%d\n", sizeof(arr[0][0]));
printf("二维数组行数:%d\n", sizeof(arr)/sizeof(arr[0]));
printf("二维数组列数:%d\n", sizeof(arr[0])/sizeof(arr[0][0]));
return 0;
}
输出:
1 2 3
4 5 6
二维数组大小为:24
二维数组一行大小为:12
二维数组元素大小为:4
二维数组行数:2
二维数组列数:3
int main()
{
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
//二维数组首地址
printf("%p\n", arr);
printf("%p\n", arr[0]);
printf("%p\n", &arr[0][0]);
printf("%p\n", &arr[0][1]);
printf("%p\n", &arr[1]);
return 0;
}
输出:
005FFB90
005FFB90
005FFB90
005FFB94
005FFB9C
int main()
{
int arr[][3] = { 1,2,3,4,5,6,7 };//定义数组时,只有挨着数组名的那个括号可以被省略大小
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
}
输出:
1 2 3
4 5 6
7 0 0
打印学生成绩:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
//定义一个数组, 存储五名学生的三门成绩
//求出每位学生的总成绩,平均成绩
//求出每门学科的总成绩,平均成绩
int arr[5][3];
//获取学生成绩
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <3 ; j++)
{
scanf("%d", &arr[i][j]);
}
}
//打印学生成绩
for (int i = 0; i < 5; i++)
{
int sum = 0;
for (int j = 0; j < 3; j++)
{
sum += arr[i][j];
}
printf("第%d名学生总成绩为:%d,平均成绩为:%d\n", i+1,sum,sum/3);
}
for (int i = 0; i < 3; i++)
{
int sum = 0;
for (int j = 0; j < 5; j++)
{
sum += arr[j][i];
}
printf("第%d门功课总成绩为:%d,平均成绩为:%d\n", i + 1, sum, sum / 5);
}
return 0;
}
输入输出:
1 23 45
12 786 45
56 89 23
123 7891 4545
7878 356 89543
第1名学生总成绩为:69,平均成绩为:23
第2名学生总成绩为:843,平均成绩为:281
第3名学生总成绩为:168,平均成绩为:56
第4名学生总成绩为:12559,平均成绩为:4186
第5名学生总成绩为:97777,平均成绩为:32592
第1门功课总成绩为:8070,平均成绩为:1614
第2门功课总成绩为:9145,平均成绩为:1829
第3门功课总成绩为:94201,平均成绩为:18840
三维数组和二维数组类似。
5.4 字符数组和字符串
字符串是特殊类型的字符数组
#include
int main()
{
//定义字符数组
char arr[5] = {'h','l','l','e','o'};
printf("%d\n", sizeof(arr));
//字符串的结束为\0
char arr2[] = { "hello" };//这里面是有\0在结尾的
//数字0等同于\0,但是不等同于'0'
for (int i = 0; i < sizeof(arr); i++)
{
printf("%c", arr[i]);
}
printf("\n");
for (int i = 0; i < sizeof(arr); i++)
{
printf("%c", arr2[i]);
}
printf("\n");
printf("arr2的大小为:%d\n",sizeof(arr2));
return 0;
}
输出:
5
hlleo
hello
arr2的大小为:6
int main()
{
//定义字符数组存储字符串
char ch[10];
scanf("%s", ch);//ch本身就是一个地址,所以不用加&符号
//scanf接收空格或者换行结束,所以中间不能用空格隔开输入的内容
printf("%s", ch);
return 0;
}
输入:hello wor
输出:hello
字符串的拼接:
int main()
{
char ch1[] = "hello";
char ch2[] = "world";
char ch3[20];
int i = 0;
int j = 0;
while (ch1[i] != '\0')
{
ch3[i] = ch1[i];
i++;
}
while (ch1[j] != '\0')
{
ch3[i+j] = ch2[j];
j++;
}
ch3[i + j] = '\0';
printf("%s", ch3);
return 0;
}
输出:helloworld
字符数组与字符串的区别:
c语言中没有字符串这种数据类型,可以通过char的数组替代
字符串一定是一个char数组,而char数组不一定都是字符串(没有\0结尾的就不是字符串)
数字0和字符'0'等价,以它们结尾的char数组就是字符串,但是如果数组没有以数字0结尾,那么就是普通数组。
扫描输入字符串时,可以在%s之间限定输入个数,比如%9s,这样前面定义一个arr[10],就不会越界乱码了
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
char ch[1000];
//gets(ch);//通过键盘获取一个字符串
//gets接收字符串可以带空格
scanf("%[^\n]", ch); //通过正则表达式,scanf也可以接收空格输入了,在遇到换行符时才会输出
printf("%s\n", ch);
return 0;
}
输入:daskl, ,e wqoeafk dsfm,z.cmz
输出:daskl, ,e wqoeafk dsfm,z.cmz
fgets函数:从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上字符‘\0’,作为字符串结尾
char *fgets(char *s,int size,FILE *stream);
s:字符串,size:指定最大读取字符串的长度(size-1),stream:文件指针,如果读键盘输入的字符串,固定写为stdin
int main()
{
char ch[10];
fgets(ch, sizeof(ch), stdin);//可以接收空格,不会越界,在输入数据少于限定数目时会自动添加\n
printf("%s", ch);
return 0;
}
puts函数:输出s字符串,在输出完成后会自动输出一个\n
参数:s——字符串首地址
int puts(const char *s)
puts(""),可以直接实现自动换行
int main()
{
char ch[] = "helloWorld";
puts(ch);//自带换行
puts("hello\0 World");//遇到\0会停止
return 0;
}
输出:
helloWorld
hello
fputs():将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件。
参数:str:字符串,stream:文件指针,如果把字符串输出到屏幕,固定写为stdout
int fputs(const char *str,FILE *stream);
int main()
{
char ch[] = "Hello World";
fputs(ch, stdout);
return 0;
}
Hello World
strlen函数:计算指定字符串s的长度,不包含结束符号\0
参数:s——字符串首地址
头文件需要导入:#include
#include
#include
int main()
{
//计算字符串有效个数
char ch[] = "hello World";
printf("数组大小为:%d",sizeof(ch) );
printf("字符串长度为:%d",strlen(ch) );
}
数组大小为:12字符串长度为:11