二维数组,字符串,字符数组

  • Post author:
  • Post category:其他




二维数组



一.二维数组初始化【此处介绍4种方法】

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}};


对各行中的某一元素赋初值

int a[3][4]={

{1},{0,5},{0,0,9}};


只对某几行元素赋初值

int a[3][4]={{1},{6,5}};
    for(int i=0;i<3;i++)
        for(int j=0;j<4;j++)
        j==3?printf("%d\n",a[i][j]):printf("%d ",a[i][j]);
        /*输出 1 0 0 0
               6 5 0 0
               0 0 0 0*/

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};

这两种写法等价



二.二维数组程序举例



1.二维数组行列互换

#include <stdio.h>
#include <stdlib.h>

void 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<2; i++)
    {
        for(j=0; j<3; j++)
        {
           printf("%5d",a[i][j]);
           b[j][i]=a[i][j];//先为数组b赋值
        }printf("\n");
    }
    printf("array b:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
            printf("%5d",b[i][j]);
            printf("\n");//再在此处输出数组b
    }
}



2.查找矩阵中最大元素及其位置

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int i,j,row=0,colum=0,max;
    int a[3][4]= {1,2,3,4,9,8,7,6,-10,10,-5,2};
    max=a[0][0];
    for(i=0; i<3; i++)
        for(j=0; j<4; j++)
            if(a[i][j]>max)
            {
                max=a[i][j];
                row=i+1;colum=j+1;
            }
            printf("%d %d %d\n",max,row,colum);
}



字符数组



一.字符数组初始化

1.逐个字符赋给数组中的各元素如

char c[10]={'I','a','m','h','a','p','p','y'};


2.如果在定义字符数组时不进行初始化,则数组中的各元素的值是不可预测的。

3.如果花括号中提供的初值个数大于数组长度,则按照语法错误处理

4.如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余元素自动定义为空字符’\0’

char c[10]={"China"};
内部存放为 C h i n a \0 \0 \0 \0 \0

5.如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,如

char c[]={'I','a','m','h','a','p','p','y'};

数组长度自动为8

6.可以使用字符串常量来使字符数组初始化,如

【三种写法等价】

char c[]={"I am happy"};
char c[]="I am happy";
char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'};



二.字符串和字符串的结束标志

1.为了测定字符串的实际长度,C规定以’\0’作为字符串的结束标志

如果有一个字符串,前面9个字符都非空,而第10个字符是’\0’,则此字符串的有效字符为9个。

2.系统对

字符串常量

也自动加一个’\0’作为结束符

3.说明

char c[5]={'C','h','i','n','a'};

完全合法,

但我们通常

char c[6]={'C','h','i','n','a','\0'};

多开一个字符为了存放末尾的空字符



三.字符与字符串的输出

1.用“%s”格式符输出字符串时,printf中出现的是***字符数组名***

2.如果数组长度大于实际长度,一直输出到’\0’结束,输出的字符不包括’\0’

3.scanf输入一个字符串

scanf("%s",c);

,从键盘输入China ,系统自动在其后加上一个’\0’结束符

4.如果利用scanf 函数输入多个字符串,则在输入时以空格分隔

char c1[5],c2[5],c3[5];
    scanf("%s %s %s",c1,c2,c3);//因为是字符数组名,所以不需要加&
    printf("%s %s %s",c1,c2,c3);

5.puts函数在遇到空字符时,换行输出(将’\0’转换为’\n’输出)

6.与scanf 的”%s”输入不同,gets输入的字符串只以回车结束,而空格是有效字符

7.strcpy函数注意事项
在这里插入图片描述



8.拓展两个不知道的函数

(1)strlwr函数:一般形式:strlwr(字符串)

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

(2)strupr函数:一般形式:strupr(字符串)

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



四.字符数组应用举例



(1)统计单词个数

#include <stdio.h>
#include <stdlib.h>
void main()
{
    char str[82];
    int i,num=0,flag=0;
    gets(str);
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]==' ') flag=0;
        else if (flag==0)
        {
            flag=1;
            num++;
        }
    }
    printf("%d\n",num);
}



(2)找到3个字符串中最大的一个

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
    char string[20];
    char str[3][20];
    int i;
    for(i=0;i<3;i++)
        gets(str[i]);
    if(strcmp(str[0],str[1])>0)//找到0,1大的那个
        strcpy(string,str[0]);
    else strcpy(string,str[1]);
    if(strcmp(str[2],string)>0)//2与最大的比较
        strcpy(string,str[2]);
    printf("%s\n",string);
}




五.数组作为函数的参数应用举例



计算矩阵的乘法:A

n*k

*B

k*m

=C

n*m

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void inputA(int n,int k,int a[][k])
{
    int i,j;
    for(int i=0;i<n;i++)
        for(j=0;j<k;j++)
        scanf("%d",&a[i][j]);
}
void inputB(int k,int m,int a[][m])
{
    int i,j;
    for(int i=0;i<k;i++)
        for(j=0;j<m;j++)
        scanf("%d",&a[i][j]);
}
void outputC(int n,int m,int a[][m])
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}
void calculateC(int n,int m,int k,int a[][k],int b[][m],int c[][m])
{
    int i,j,l;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
    {
        c[i][j]=0;
        for(l=0;l<k;l++)
            c[i][j]+=a[i][l]*b[l][j];
    }
}
int main()
{
    int n,k,m,i,j,l;
    scanf("%d%d%d",&n,&m,&k);
    int a[n][k],b[k][m],c[n][m];
    inputA(n,k,a);
    inputB(k,m,b);
    calculateC(n,m,k,a,b,c);
    outputC(n,m,c);
    return 0;
}



版权声明:本文为LovelyZhou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。