C语言-初识数组

本文介绍了数组的基本概念,包括一维数组的定义、初始化、内存分配和遍历。提到了数组越界问题的重要性,并展示了清零函数`bzero`和`memset`的使用。此外,详细讨论了字符数组的声明、输入输出以及如何计算字符串的实际长度。还提供了涉及字符串处理和字符统计的编程练习。
摘要由CSDN通过智能技术生成

目录

【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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值