目录
【1】初识数组
【2】一维数组
【3】清零函数
【4】字符数组
【5】计算字符串实际长度
练习:
【1】初识数组
1. 概念:具有一定顺序的若干变量的集合
2. 定义格式:
数组名 :代表数组的首地址,地址常量,不能为左值
访问元素 :数组名[下标],下标从0开始,到n-1;
数组越界问题需要注意!!!
3. 特点:数据类型相同,内存连续
4. 注意:
- 数组的类型就是数组元素的数据类型
- 数组名符合标识符命名规则
- 同一个函数中,数组名不能和其他变量名相同
- 【】下标从0开始到n-1结束
【2】一维数组
1.格式
数组名: 代表数组的首地址,地址常量,不能为左值
访问元素:数组名[下标], 下标从0开始,到n-1;
数组越界问题需要注意!!!
2.初始化:
1)全部初始化:
int a[5]={1,2,3,4,5}; // 1 2 3 4 5
2)部分初始化:未被赋初值的元素值为0
int a[5]={1,2,3}; //1 2 3 0 0
3)未初始化:只能单个赋值,未被赋初值的元素值为随机值
int a[5]; a[0]=1; a[2]=3; //1 随机 3 随机 随机
3.定义空数组:
int a[5]={0,0,0,0,0};
int a[5]={0};
int a[5]={};
4.引用
1)先定义向后引用
2)每次只能引用数组的一个元素a[i],如果想要引用所有元素,可以for循环遍历
3)防止数组越界
4)打印数组元素地址,%p
5.内存分配
5. 数组遍历
for循环,把元素下标作为循环变量,循环范围就是0~n-1
6. 数组的大小
sizeof(数组名) 数据类型的大小*元素个数
练习:计算斐波那契数列前15项并逆序输出
1 1 2 3 5 8 13 21 .....
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[15] = {1, 1};
for (int i = 2; i < 15; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
for (int i = 14; i >= 0; i--)
{
printf("%d ", arr[i]);
}
return 0;
}
【3】清零函数
头文件:#include <strings.h>
void bzero(void *s, size_t n);
功能:将内存空间置零
参数:
s:要清空内存的首地址
n:要清空字节数
返回值:无
例子: int a[5]={1,2,3,4,5}; bzero(a,sizeof(a)); //以地址a开始,将sizeof(a)个字节清空为0
头文件:#include <string.h>
void *memset(void *s, int c, size_t n);
功能:将内存空间设置为0
参数:
s:要清空内存的首地址
c:要设置的值,0
n:要清空字节数
返回值:要清空内存的首地址
例子: int a[5]={1,2,3,4,5}; memset(a,0,sizeof(a)); //以地址a开始,将sizeof(a)个字节设置为0
【4】字符数组
1.定义方式
1)char a[]={'a','b','c'}; //sizeof(a)==3, 单个字符赋值
2)char b[]={"abc"}; //sizeof(b)==4,字符串赋值
3)char c[]="abc"; //sizeof(c)==4,字符串赋值
注意:字符串赋值经常容易忽略数组的长度,一定要注意数组越界!!!
2. 输入输出
输入:
char buf[32]={};
1) scanf("%s",buf); //遇到空格或\n都会认为字符串输入完成,结束
scanf("%[^\n]",buf); //直到遇到\n才会结束,字符串可以包含空格
2)gets
char *gets(char *s); //gets不会检查数组越界
功能:从终端获取字符串
参数:
s:目标数组的首地址
返回值:同参数、
输出:
1)printf("%s",buf); //打印到\0为止
2)puts
int puts(const char *s);
功能:向终端输出字符串
参数:
s:要输出字符串的首地址
返回值:输出字符的个数(包括\0)
练习1:输入一串字符,计算其中空格个数
#include <stdio.h>
int main() {
char str[100];
int count = 0;
printf("请输入一串字符:");
scanf("%[^\n]", str);
// 遍历字符串,计算空格个数
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == ' ') {
count++;
}
}
printf("空格的个数为:%d\n", count);
return 0;
}
练习2:将一串字符串进行倒置,例如:char buf[32]=”hello”;
#include<stdio.h>
int main(int argc, char const *argv[])
{
char buf[32]="hello";
char t;
int n,i;
for(n=0;buf[n] != '\0';n++);//n==5,实际个数
for(i=0;i<n/2;i++)//交换n/2次
{
t = buf[i];
buf[i] = buf[n-1-i];
buf[n-1-i] = t;
}
printf("%s\n",buf);
return 0;
}
【5】计算字符串实际长度
1.通过for循环,直到\0为止
2. #include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际长度,不计算\0
参数:
s:要计算的字符串首地址
返回值:实际长度
例如:char buf[32]="hello";
int t = strlen(buf); //t == 5
区分strlen和sizeof
1. strlen是函数;sizeof是关键字
2. strlen是用来计算字符串的实际长度;sizeof计算数据所占空间大小
3. strlen不计算\0,sizeof计算\0,字符数组省略元素个数时,sizeof比strlen大1
练习:
1.在终端输入大写字母、小写字母、空格、数字,分别在终端输出他们的个数
#include <stdio.h>
int main() {
char ch;
int uppercaseCount = 0;
int lowercaseCount = 0;
int spaceCount = 0;
int digitCount = 0;
printf("请输入一串字符,以回车结束:\n");
while ((ch = getchar()) != '\n') {
if (ch >= 'A' && ch <= 'Z') {
uppercaseCount++;
} else if (ch >= 'a' && ch <= 'z') {
lowercaseCount++;
} else if (ch == ' ') {
spaceCount++;
} else if (ch >= '0' && ch <= '9') {
digitCount++;
}
}
printf("大写字母个数:%d\n", uppercaseCount);
printf("小写字母个数:%d\n", lowercaseCount);
printf("空格个数:%d\n", spaceCount);
printf("数字个数:%d\n", digitCount);
return 0;
}
2.编写一个程序,找出1000以内所有的完数,所谓完数就是一个数恰好等于它的因子之和,
例如6=1+2+3,6就是一个完数。
#include <stdio.h>
void findPerfectNumbers(int limit) {
int i, j, sum;
printf("1000以内的完数有:\n");
for (i = 2; i <= limit; i++) {
sum = 1; // 初始化因子之和为1
for (j = 2; j <= i / 2; j++) {
if (i % j == 0) {
sum += j; // 累加因子
}
}
if (sum == i) {
printf("%d ", i);
}
}
printf("\n");
}
int main() {
int limit = 1000;
findPerfectNumbers(limit);
return 0;
}