C语言学习,这一篇就够了!(二)

举报
阿童木 发表于 2021/08/18 07:28:41 2021/08/18
【摘要】 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;注意:下标从...

3. 数组

数组是一组具有==相同类型==的数据的集合,这些数据称为==数组元素==。

3.1 一维数组

格式为:类型符 数组名[常量表达式]。数组的所占字节数为元素个数与基类型所占字节数的乘积。

3.1.1 一维数组的初始化

三种方式

  1. int array[5] = {1,2,3,4,5}
  2. int array[] = {1,2}
  3. int array[2]; a[0] = 1;a[1]=2;

注意:

  1. 下标从0开始
  2. 数组内元素的个数不能大于声明的数组长度
  3. 当元素个数小于数组的长度时,多余的数组元素初始化为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个元素

注意

  1. 避免数组越界访问,循环变量i不要超过数组的长度
  2. 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;
}

输出:

f

3.2 二维数组

多维数组中最简单的就是二维数组,二维数组有两个下标,用来确定它在数组中的位置。二维数组可以被认定为是一个由行列组成的方阵,但是在内存中是线性的,按行依次来进行存放

格式为:类型说明符 数组名[常量表达式] [常量表达式]

3.2.1 二维数组的初始化

第一种

int num[2][3] = {{1,2,3},{4,5,6}};

rc

第二种

int num[2][3];
num[1][1] = 2;

第三种

int a[2][3] = {1,2,3,4,5,6}

注意:

  1. 由于系统会根据数组中元素的总个数来分配空间,所以当知道元素总个数以及列的维数后,会计算出行的维数
  2. 二维数组定义时可以不指定行,但是一定要指定列

3.2.2 引用二维数组元素

格式为:数组名[下标] [下标]

如:a[1][2]

注意:

  1. 数组元素可以出现在表达式中,可以被赋值b[1][2] = a[2][3]/2
  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 字符数组初始化

  1. char 字符串名称[长度] = "字符串"
  2. char 字符串名称[长度]= {'字符','字符'}

注意

  1. []中的长度可以省略不写
  2. 采用第二种方式定义数组,最后一个元素必须为\0
  3. 如果初值个数小于数组长度,则后面自动补为\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 字符串的输入输出

  1. 逐个字符输入输出,采用格式符%c输入或输出一个字符
  2. 将整个字符串输入输出,采用%s格式符,如printf("%s\n",c);

注意

  1. 输出的字符中不包括\0
  2. 通过%s输出时,输出表列填写的==是数组名称,而不是数组元素==
  3. 遇到第一个\0就结束
  4. 在采用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. 若出现不相同的字符,则以第一对不相同的字符的比较结果为准

比较结果由函数值带回

  1. 如果字符串1和字符串2相同,则函数值为0
  2. 如果字符串1大于字符串2,则函数值为1个正整数
  3. 如果字符串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


博主累了,码了几天,已经码了上万字了,自己也是一边复习一边整理,感觉还不错噢,相信你也一定能够学到很多噢!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。