C语言(四)---数组

数组的定义

  • 为什么要使用数组

单一的变量很难满足需求,这个时候多变量的集合数组出现了

  • 数组的定义

类型 数组名[数组大小];

    int arr[100];   //定义100个int类型的变量 

类型可以是int double float char 这些基本数据类型中的任意一种

  • 数组的初始化
    int arr[10] = {1,2,3,4,5,6,7};  //初始化
    arr[1] = 100;                   //赋值

数组元素的使用

  • 数组的使用方式
    //给每个元素赋值
    for(int i=0;i<100;i++)
    {
        arr[i]=i+1; //给数组赋值从1到100
    }
  • 下标运算符[]

[ ]里面的数字 称之为下标

下标从0开始

下标不能超过定义的数组大小

    int arr[4];
    arr[4] = 5; //错误写法 arr数组只有0,1,2,3这三个下标
  • 注意事项
  1. 初始化可以给一组数据赋值,后面用{} 括起你要赋值的数据,数据用逗号隔开
  2. 赋值的个数少 未赋值的用0赋值
#include<stdio.h>
int main()
{
    int arr[10]={1,2,3,4,5,6,7};    //初始化
    for (int i = 0; i < 10; i++)
    {
        printf("%d\t", arr[i]);     //打印结果为1 2 3 4 5 6 7 0 0 0
    }
    printf("\n");
    return 0;
}
  1. 定义数组的时候可以不指定数组大小,但必须初始化,系统自动分配大小
    int arr[];              //错误  
    int arr[]={1,2,3,4,5,6};//正确
  1. 数组的大小不建议省略

循环和数组的搭配

  • 斐波那契数列

斐波那契数列:1 1 2 3 5 8 13 21 34...... 每一个元素是前两个元素之和

#include<stdio.h>
int main()
{
    int Fabo[20]={1,1};
    //循环给Fabo数组赋值
    for(int i=0;i<20;i++)
    {
        Fabo[i]=Fabo[i-1]+Fabo[i-2];
    }
    //输出斐波那契数列
    for (int i = 0; i < 20; ++i)
    {
        printf("%d\t", Fabo[i]);
    }
    printf("\n");
    return 0;
}

二维数组和多维数组

  • 数组的定义

类型 数组名[ 行 ] [ 列 ]

    int Arr[3][4]={ { 1, 2, 3 }, { 1, 2 }, { 2, 3, 4, 5 } };    //初始化
    Arr[0][0]=100;                                              //赋值
  • 数组的使用方式

    实例:杨辉三角

#include<stdio.h>
#define N 10
int main()
{
    int a[N][N]={{1},{1,1}};
    int i,j;
    for(i=2;i<N;i++)
    {
        for(j=0;j<=i;j++)
        {           
            a[i][j]=a[i-1][j]+a[i-1][j-1];  //上方和左上角之和
        }
    }
    //打印杨辉三角
    for(i=0;i<N;i++)
    {
        for(j=0;j<=i;j++)
        {
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
}

打印效果:

1
1       1
1       2       1
1       3       3       1
1       4       6       4       1
1       5       10      10      5       1
1       6       15      20      15      6       1
1       7       21      35      35      21      7       1
1       8       28      56      70      56      28      8       1
1       9       36      84      126     126     84      36      9       1
Press any key to continue

字符数组

  • 字符串常量
  1. 什么是字符串常量

一般用一对双引号" "括起的一串字符来表示字符串常量 例如:"hello world"

  1. 字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。
  2. %s用于打印字符串
printf("%s", "hello world");

  • 字符数组
  1. 字符串只能用字符数组存放
char str[128];  //字符数组
printf("请输入一段文字\n");
scanf("%s", str);//让用户输入一个字符串
printf("用户输入的内容是:%s", str);

  • 字符串用'\0' 作为字符串结尾

\0 对应的ASCII码是0

一般使用字符串的时候会自动加在后面

  • 一段代码让你了解字符串

首先输入下面的代码,运行

#include<stdio.h>
int main()
{
    char arr[128];
    printf("请输入一段文字:");
    scanf("%s",arr);
    printf("%s\n",arr);
    for(int i=0;i<128;i++)
    {
        printf("%c",arr[i]);
    }
    return 0;
}

输入helloworld 运行结果

请输入一段文字:helloworld
helloworld
helloworld 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫蘌ress any key to continue

  1. 你输入helloworld,%s打印helloworld
  2. %c打印helloworld之后有一个空格,然后后面全是烫烫烫烫
  3. 事实表明每一个字符串后面都有一个'\0'
  4. 烫烫烫烫烫烫烫烫烫烫烫烫是没有意义的,因为他们没有赋值,换成%d打印arr里面的元素,你会发现烫烫烫对应的数字为-52,而ASCII码表只有0~128,所以显示乱码
  • 字符串的赋值方式
  1. 单个元素赋值(不推荐)
    char arr[6];
    arr[0]='h';
    arr[1]='e';
    arr[2]='l';
    arr[3]='l';
    arr[4]='o';
    arr[5]='\0';
    printf("arr字符串内容为:%s\n",arr);   //输出hello

  1. 初始化赋值字符串
    char arr[6]="hello";
    printf("arr字符串内容为:%s\n",arr);   //输出hello

  1. 中文 一个汉字需要占用两个char

汉字占用两个字节 (视为字符串) 不能用%c打印中文

  • 注意事项
  1. 输入数组的时候不用加&取地址符号,只需要输入数组名(数组名就是地址)
/************数组名就是数组首地址************/
char str[128];  //字符数组
scanf("%s", str);//让用户输入一个字符串

  1. 字符数组单个元素赋值一定要加'\0'否则会出现乱码 “烫烫烫”
  2. 尽量保证字符数组足够大,否则输入的内容大于字符数组大小会出现越界。
char arr[10] = "helloworld";    //数组大小太小了 会报错

字符数组和字符串的区别
  1. 多个字符,不一定代表一个字符串,他可能是一个字符数组,而不是字符串
  2. 字符数组:他是不包含末尾结束符'\0'
  3. 字符串:多个字符,但是它的末尾是有结束符'\0'
    char name[5]={'a','b','c','d','e'}; //字符数组
    char name[5]={'a','b','c','d','\0'};//字符数组

  1. 通过双引号"hello world"在末尾自动加上'\0' ‘\0'占一个位置
  2. 在C语言里面凡是出现乱码就是你用%s打印字符数组而不是字符串

字符串函数

字符串输入输出函数
  • gets

用法:gets(字符数组名) 用于输入一个字符串

  • puts

用法:puts(数组名) 用于输出一个字符串

字符串处理函数

需要加头文件#include<string.h>

  • strcmp

用法:strcmp(字符串,字符串2) 比较两个字符串

#include<stdio.h>
#include<string.h>
int main()
{
    char a[20],b[20];
    puts("请输入字符串a:");
    gets(a);
    puts("请输入字符串b:");
    gets(b);
    int temp=strcmp(a,b);
    if(temp==0)
        printf("这两个字符串相同\n");
    else if(temp>0)
        printf("字符串a比b大");
    else if(temp<0)
        printf("字符串a比b小");
    return 0;
}

需要注意的是比较规则不是看ASCII码值的大小

  • strcpy

用法:strcpy(字符数组1,字符串2 ) 将字符串2复制到字符数组1中去(覆盖)

为什么要有strcpy函数???

    char str1[10]="hello";
    char str2[10];
    str2=str1;  //没有这种语法,会报错
    
    char str3[10];
    str3="hello";`//左值地址是不能修改的 会报错

C语言里面数组是不能直接赋值,所有用strcpy来变相进行赋值操作

    char str1[10],str2[]="hello";
    strcpy(str1,str2);  //str1的内容是"hello"

  • strcat

用法:strcat(字符数组1,字符数组2) 将字符串2拼接到字符数组1中去(追加)

    char str1[10]="hello",str2[]="world";
    strcat(str1,str2);  //str1的内容是"helloworld"

  • strlen(重要)

用法:strlen(字符串) 求字符串长度(\0前面有效字符的个数)

    printf("字符串的长度为:%d",strlen("hello"));   
    //打印字符串的长度为:5

  • 不常用函数
函数 作用
strstr(字符串1,字符串2) 断一个字符串里面是否含有某个字符
strlwr(字符串) 将字符串中大写字母转换成小写字母
strupr(字符串) 将字符串中小写字母转换成大写字母
sprintf() 格式化输出

strstr使用示例

    if (strstr("张三李四王五", "四王") != 0)    //字符串2属于字符串1返回不为0的数,否则返回0
    {
        puts("字符串1中含有字符串1");
    }
    else
    {
        puts("字符串1中不含字符串2");
    }

sprintf()的使用示例

这个函数很实用,对于计算机软件专业的来说用的特别多

//简单使用的示例,我必须说明额是它的功能很强大
#include<stdio.h>
int main()
{
  int a;
  char arr[100];
  scanf("%d",&a);
  sprintf(arr,"我有%d亿人民币",a);
  printf("%s",arr);
  putchar(10);
  return 0;
}

注意事项
  1. gets和scanf的区别

同样是输入字符串,gets输入的字符串可以包含空格scanf遇空格结束输入

  • 示例
#include<stdio.h>
int main()
{
    char arr[128];
    printf("请输入字符串:");
    gets(arr);
    printf("你输入的字符串为:%s\n",arr);

    printf("请输入字符串:");
    scanf("%s",arr);
    printf("你输入的字符串为:%s\n",arr);
    return 0;
}

输入输出:

请输入字符串:hello world
你输入的字符串为:hello world
请输入字符串:hello world
你输入的字符串为:hello
Press any key to continue

  1. 字符串处理函数一定要加头文件
#include<stdio.h>

  1. strcpy,strcat这两个函数要注意字符数组的大小
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355