C语言学习——数组

目录

七、数组

7.1一维数组的定义和引用

一维数组元素的引用

数组元素的引用

一维数组的初始化

一维数组程序举例

7.2二维数组的定义和引用

二维数组的引用

二维数组的初始化

二维数组程序举例

7.3字符数组

字符数组的定义

字符数组的初始化

字符数组的引用

字符串和字符串结束标志

字符数组的输入输出

字符串处理函数

puts函数

gets函数

strcat函数

strcpy和strncpy

strcmp函数

strlen函数

strwr函数

strupr函数

字符串数应用举例


七、数组

本章只介绍数组。数组是有序数据的集合。数组中的每一个元素都属于同一数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。

本章介绍在C语言中怎样定义和使用数组。

7.1一维数组的定义和引用

一维数组的定义方式为:

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

例如:

int a[10];  //表示定义了一个整型数组,数组名为a,此数组有10个元素

说明:

  • 数组名的命名规则与变量名的相同,遵循标识符命名规则。

  • 在定义数组时,需要指定数组中的元素个数,方括号中的常量表达式用来表示元素的个数,即数组长度。但需要注意的是,数组的下标是从0开始的。

  • 常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖与程序运行过程中变量的值。例如,下面这样定义数组是不行的:

  • int n;
    scanf("%d",&n);  //在程序中临时输入数组的大小
    int a[n];
一维数组元素的引用

数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。

数组元素的表现形式为:

数组名[下标]

下标可以是整型常量或者整型表达式。例如:

a[0] = a[5] + a[7] + a[2*3];

注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到“数组名[下标]”的区别:

int a[10];  //是定义数组的长度为10
t = a[5];  //引用a数组中序号为5的元素。此时5不能代表数组长度
数组元素的引用
#include<stdio.h>
int main()
{
    int i,a[10];
    for(int i=0;i<=9;i++)
    {
        a[i]=i;
    }
    for(int i=9;i>=0;i--)
    {
        printf("%d ",a[i]);
    }
    return 0;
 } 
​
//输出结果:9 8 7 6 5 4 3 2 1 0 
一维数组的初始化

对数组元素的初始化可以用以下方法实现:

(1)在定义数组时对数组元素赋予初值。例如:

int a[10] = {0,1,2,3,4,5,6,7,8,9};

(2)可以只给一部分赋值。例如:

int a[10] = {0,1,2,3,4};  //前5个赋初值,后5个元素值为0;

(3)如果想使一个数组中全部元素值为0,可以写成:

int a[10] = {0,0,0,0,0,0,0,0,0,0};
//或者
int a[10] = {0};

(4)在对全部数组赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:

int a[5] = {1,2,3,4,5};
//可以写为:
int a[] = {1,2,3,4,5};

在第二种写法中,花括号中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如想定义数组长度为10,就不能省略数组的长度定义,而必须写成:

int a[10] = {1,2,3,4,5};   //只初始化前5个元素,后5个元素为0;
一维数组程序举例

用数组来求Fibonacci数列问题。

程序如下:

#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("%12d",f[i]);
    }
    return 0; 
 } 

关于这道题的程序补充讲解跳转

7.2二维数组的定义和引用

二维数组定义的一般形式为:

类型说明符 数组名 [常量表达式] [常量表达式];

例如:

float a[3][4],b[5][9];
二维数组的引用

二维数组元素的表现形式为:

数组名[下标] [下标];

注意,下标可以是整型表达式。

二维数组的初始化

(1)分行给二维数组赋初值。例如:

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

(2)可以将所有元素放在一个花括号内,按数组排列的顺序对各元素赋初始值。例如:

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

(3)可以对部分元素赋初始值。例如:

int a[3][4] = {{1},{5},{9}};  //只对各行的第一列赋初始值

(4)如果对全部元素都赋初始值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//等价于
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

从本节的介绍中可以看到:C语言在定义数组和表示数组的时候采用a[ ] [ ] 这两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。

二维数组程序举例

将一个二维数组a的行和列的元素互换,存到一个二维数组b中。

#include<stdio.h>
int main()
{
    int a[2][3]={{1,2,3},{4,5,6}};  // 直接初始化数组,数据题目已经给出具体,这里我在题目未标明 
    int b[3][2],i,j;
    printf("array a:\n");
    for(i=0;i<=1;i++)
    {
        for(j=0;j<=2;j++)
        {
            printf("%5d",a[i][j]);
            b[j][i] = a[i][j];
        }
        printf("\n");
     } 
     printf("array b:\n");
     for(i=0;i<=2;i++)
     {
        for(j=0;j<=1;j++)
        {
            printf("%5d",b[i][j]);
         }
         printf("\n");
     }
    return 0; 
 } 

运行结果:

7.3字符数组

用来存放字符数据的数组就是字符数组。字符数组中的一个元素存放一个字符。

字符数组的定义

字符数组的定义与前面介绍的相类似,就是把数字换成了字符。

char ch[10];

由于字符型和整型是相互通用的,因此可以定义一个整型数组,用它存放字符数据。例如

int c[10];
c[0] = 'a';  //合法,但浪费存储空间
字符数组的初始化

对字符数组初始化,最容易理解的方式是逐个字符赋给数组中的各个元素。例如:

char c[10] = {'I',' ','a','m','','h','a','p','p','y'};  //把10个字符分别赋给才c[0]~c[9]这10个元素。
字符数组的引用

可以引用字符数组中的一个元素,得到一个字符。

输出一个字符串。

#include<stdio.h>
int main()
{
    char c[10] = {'I',' ','a','m',' ','a',' ','b','o','y'};
    int i;
    for(i=0;i<10;i++)
    {
        printf("%c",c[i]);
    }
    return 0; 
 } 
//输出结果:I am a boy 
字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的。

为了测量字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'作为标志。

说明:'\0' 代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的作用。

对C语言处理字符串的方法有了一定的了解之后,再对字符数组初始补充一种方法,即用字符串常量来是字符数组初始化。例如:

char c[] = {"I am happy"};
//也可以省略花括号直接写成:
char c[] = "I am happy";  //注意,数组c的长度是11,因为字符串常量的最后由系统加上一个'\0'.
字符数组的输入输出

字符数组的输入输出有两种方法:

(1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。

(2)将整个字符串一次输入或输出。用"%s"格式符,意思是字符串(string)的输入输出。例如:

char c[] = "China";
printf("%s",c);

注意:

(1)输出字符不包括结束符'\0';

(2)用"%s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名;

(3)如果数组长度大于字符串的实际长度,也只输出遇到'\0'结束;

(4)如果一个字符数组中包含一个以上'\0',则遇到第一个'\0'时输出就结束;

(5)可以用scanf函数输入一个字符串,例如

char c[10];
scanf("%s",c); //c是数组名,输入的字符串应该小于已定义字符数组的长度
printf("%s",c);

注意:scanf函数中的输入项如果是字符数组名,不用再加地址符&,因为在C语言数组中,数组名代表该数组的起始地址。

字符串处理函数

在C语言函数库中提供了一些用来处理字符串的函数,使用方便。下面介绍几种常用的函数

puts函数

puts(字符数组)

作用:将一个字符串输出到终端。

gets函数

:gets(字符数组)

作用:从终端输入一个字符串到数组,并且得到一个函数值。该函数值是字符数组的起始地址。

注意:puts和gets函数只能输出或输入一个字符串。

strcat函数

:strcat(字符数组1,字符数组2)

作用:连接两个字符数组中的字符串,把字符2接到字符1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址例如:

#include<stdio.h>
#include<string.h> // 确保包含 strcat 函数所需的头文件 
​
int main()
{
    char str1[30] = "hello ";
    char str2[20] = "world";
    strcat(str1,str2);
    printf("%s",str1);  //hello world
    return 0; 
 } 

说明:

  • 字符数组1必须足够大,以便容纳连接后的新字符串。

  • 连接前两个字符串的前后都有'\0',连接时将字符串1后面的'\0',取消,只在新串最后保留'\0'。

strcpy和strncpy

一般形式为:

strcpy(字符数组1,字符数组2);

作用:这是“字符串复制函数”,作用是将字符串2复制到字符串1中去。

#include<stdio.h>
#include<string.h>
​
int main()
{
    char str1[20] = "",str2[10] = "China",str3[20] = "";
    strcpy(str1,str2);   //China
    strcpy(str3,"hello");  //hello
    printf("%s\n",str1);
    printf("%s\n",str3);
    return 0;
 } 

可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。例如

char str1[20] = "",str2[10] = "China";
strncpy(str1,str2,2);
printf("%s\n",str1);  //Ch 
strcmp函数

strcmp(字符串1,字符串2)

作用:比较字符串1和字符串2。例如:

strcmp(str1,str2);
strcmp("China","Korea"); 
strcmp(str1,"Bei jing")

字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),知道出现不同的字符或遇到'\0',为止。如全部字符相同,则认为相等;若出现不同的字符则以第一个不相同的字符的比较结果为准。例如:

"A" > "B";
"a" > "A";
"computer" > "compare";
"these" > "that";
"36+54" >"! $&#";
"CHINA" > "CANADA";
"DOG" > "cat";

如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中为止在后面的为“大”。但应注意小写字母比大写字母“大”。

比较的结果由函数值带回:

str1 == str2 ; //函数值为0
str1 > str2 ; //函数值为一个正整数
str1 < str2 ; //函数值为一个负整数
#include<stdio.h>
#include<string.h>
​
int main()
{
    char str1[20] = "Hello",str2[10] = "China";
    if(strcmp(str1,str2)>0)
        printf("yes");  //yes
     
    return 0;
 } 
strlen函数

strlen(字符数组)

作用:测试字符串长度的函数。函数的值为字符串中实际的长度(不包括'\0'在内)。

strwr函数

strlwr(字符串)

作用:将字符串中大写字母转换成小写字母

strupr函数

strupr(字符串)

作用:将字符串中小写字母转换成大写字母

字符串数应用举例

输入一行字符,统计其间有多少个单词,单词之间用空格分开。

#include<stdio.h>
#include<string.h>
​
int main()
{
    char str[81];
    int num=0,word=0;
    char c;
    gets(str);
    for(int i=0;(c=str[i])!='\0';i++)
    {
        if(c==' ') word=0;
        else if(word==0)
        {
            word = 1;
            num++;
        }
    }
    printf("There are %d words in the line.\n",num);
    return 0;
 } 
 
//输入:a ab abc abcd abcde
//输出:There are 5 words in the line.

声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值