C语言DAY10 - 字符串

来源:互联网 发布:编程语言的种类 编辑:程序博客网 时间:2024/05/30 04:58

        • 一二维数组
          • 语法
          • 1创建
          • 2存储
          • 3取出
          • 4声明补充
          • 5声明
      • 最常用
        • 二二维数组在内存中的存储
          • 高地址向低地址连续申请行列每个元素占用的字节
          • 求二维数组的地址和长度
        • 三二维数组和函数
          • 解决方案
      • 字符数组
        • 字符串
          • 使用双引号引起来的数据叫做字符串
            • 不管那种方式系统都是以第一种最根本的方式字符数组存储的
            • 如果指定长度小于字符串的长度就会出现存储不下的情况
          • 不能通过 siceof 计算有可能字符串数据存储在字符数组中只占了一部分
          • 下面四个是
            • cmpcompare

一.二维数组

语法:
1)创建

元素类型 元素名[行数][列数]

int arr [3][4] 
2)存储

二维数组名[行下标][列下标] = 数据

行列下标越界会更改分配内存外的数据

3)取出
数据类型 变量名 = 二维数组名[行下标][列下标]
4)声明补充

声明必须指定行数列数

行数列数可以是变量 常亮 宏 表达式 1 0等

不能是小数 也不能是负数

如果声明没有赋值,元素中是垃圾值

5)声明

1.先声明 在一个个初始化

2.声明时初始化
这样行数可以省略

最常用

int arr [][4] = {

{10,20,30,40},

{50,60,70,80},

{90,100,110,120}

};

3.自动分行

也可以省略行数,总数除以列数自动分行

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

4.部分初始化

int arr[3][4] = {{10},{20},{30}};

初始化指定行数据,其他的数据自动初始化为0.

省略数据,自动计算行数

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

给指定的行赋值

int arr[3][4] = {[1]={1,2,3,4},[2]={5,6,7,8}};

给指定的元素赋值

int arr[3][4]={[0][1]=20,[1][3]=6};

其他的值初始化为0

二.二维数组在内存中的存储

1.高地址向低地址连续申请(行每个元素占用的字节)

二维数组的本质其是个一维数组

类型是数组的长度为行数的一维数组

2.求二维数组的地址和长度

1)

arr = arr[0] = arr[0][0]

2)真正的元素的个数

sizeof(arr)/sizeof(arr[0][0])

行数

int rows = sizeof(arr)/sizeof(arr[0]);

列数

int cols = sizeof(arr[0])/sizeof(arr[0][0])

三.二维数组和函数

  • 1 二维数组作为参数传递给函数会丢失行列,因 为传递的是一个8字节的地址,数组的最低字节的地址.
  • 2 作为参数的时候行数可以省略,可以和函数声明的不一样,列数不行
  • 3 传递数组的时候将行数和列数一起传递
解决方案:

先声明行数和列数,最后在写二维数组.

void arr(int rows,int cols,arr[][cols]); 1. 形参二维数组行数可以省略,列数不行2. 实参二维数组行数可以任意,但列数必须保持一致.

字符数组

  • 声明字符数组

    char chs[4];
    chs[0] = ‘a’;
    chs[1] = ‘b’;
    chs[2] = ‘a’;
    chs[3] = ‘z’;

    char chs[4] = {‘a’};
    //初始化部分元素,其他元素自动被初始化未\0
    //\0的 asc 码是0

  • 字符数组的取值和遍历 for 循环
  • char 变量不能存中文,一个中文3个字节,char 只有1个

字符串

使用双引号引起来的数据叫做字符串.
  • 原理

    1. 字符串是由一个个字符组合起来的
    2. 所以我们用字符数组存储字符串数据
    3. 将字符串数据的没一个字符存储到字符中,并在后面追加一个\0代表存储完毕.
  • 语法

    一.字符数组    char name  [4];    name[0] = 'j';    name[1] = 'a';    name[2] = 'c';    name[3] = 'k';二.字符串最根本的方式    char name[5] = {'j','a','c','k','\0'};    //5可以任意值,\0代表结束三.简写方式    char name[] = {"jack"};    //系统会将字符串的每一个字符存储到字符数组中,并自动追加'\0'四.最常用的方式!!!    char name[] = "jack";    //系统会将字符串的每一个字符存储到字符数组中,并自动追加'\0'
不管那种方式系统都是以第一种最根本的方式字符数组存储的
  • 计算字符串长度

    char name[] = “中国”;
    int len = sizeof(name);
    //如果指定了长度,那就是指定的长度了
    //如果声明字符数组的同时就声明一个字符串,就可以用中文.一个中文3个字符.

如果指定长度小于字符串的长度,就会出现存储不下的情况
  • 打印 %s

    printf(“%s\n”,name);
    //传递字符数组地址,逐字节输出,遇到\0为止.

    char str1[] =”jack”;
    char str2[4] = “rose”;
    printf(“%s”,str2);
    //打印结果 rosejack

    char str1[] ={‘j’,’a’,’\0’,’k’,’\0’};
    char str2[3] = {‘r’,’o’,’s’,’e’};
    输出结果为:rosja
    超出数组范围部分丢掉

    //如果这样写,那就把 str1[0]改成了’e’了.
    str2[3] = ‘e’;

  • 接收 %s

    char str[10];
    //准备一个10个长度的字符串
    scanf(“%s”,str);
    //数组的名称代表数组地址,不需要取地址

    注意:

    1. 输入的字符串数据在给定的字符长度存储不下,就会崩溃.
    2. 输入的时候如果有空格就会认为输入结束
  • 不安全:

    1. 字符存储不下会报错.
    2. 空格会认为结束
    3. scanf 就这样的没法解决
  • 计算数组长度

不能通过 siceof 计算,有可能字符串数据存储在字符数组中只占了一部分.
char name[100] = "jack";sizeof(name);//这个字符串就是100长度.字符串只有4个int len = 0;while(name[len]!='\0')
  • puts( )输出

    作用: 用来输出字符串
    语法格式: puts(字符数组名);
    优点: 输出完毕,自动换行
    缺点:只能输出字符串,也不能使用占位符

  • gets( )接收

    char name[10];
    printf(“请输入你的姓名:”);
    gets(name);
    作用:接收一个字符串
    优点:可以接收空格
    缺点:字符数组长度不够,都会崩溃
    指针会讲一个安全的方法

下面四个是
cmp–>compare
char name1[] ="jace";char name2[] = "rose";int res = strcmp(name1,name2);//结果是name1-name2同位置字符的 acs 码的差.
  • strcpy( ) 拷贝

    char name1[] = “smith”;
    char name2[] = “:jack”;

    strcpy(name1,name2);

    1. name2–>name1 拷贝不是移动
    2. ‘\0’ 也一起拷贝
    3. 如果name1长度不够无法存储 name2运行会崩溃
  • strcat( ) concat:连接.

    strcat(name1,name2);

    作用:把存储在 name2的字符串链接到 name1后面
    从name1的\0开始覆盖,两个合成一个
    如果name1无法再存储name2,就会崩溃.

0 0
原创粉丝点击