C语言:20250719笔记

字符数组

在C语言中,支持字符串常量,不支持字符串变量。如果想要实现类似的字符串变量,C语言提供了两种实现方式:

  • 字符数组:
cpp 复制代码
 char name[] = "哪吒";
  • 字符指针:
cpp 复制代码
 char *name = "娜吒";
概念

元素类型为char(字符型)的数组叫做字符数组。字符数组往往是用来存储字符串数据的。需要注意的,我们C语言中的字符是字节字符(1字符 = 1字节,C语言中没有字节这个表示法,我们一般使用char表示字节,1char = 8bit)。

硬件中存放数据以bit(位)为单位,系统对于内存的操作以char(字节)为单位。系统为内存以1个字节为单位进行编号。

实验:

cpp 复制代码
 char a = 'A';      // 正确
 char b = '1';      // 正确 ASCII码:49
 char c = 1;        // 正确 ASCII码:1
 char d = '\n';     // 正确 只要其对应的 ASCII码的范围在0~127之间,都属于字符
 char e = "A";      // 错误 双引号括起来的内容叫做字符串常量
 char f = '冯';     // 错误 中文字符不在0~127这个范围内
语法

一维数组:

cpp 复制代码
 char 数组名[数组容量];

二维数组:

cpp 复制代码
 char 数组名[行容量][列容量];

字符数组的语法就是我们之前所学的一维数组和二维数组的语法,只不过数据类型是char而已。

注意:

如果我们的char数组初始化的时候,没有完全初始化值的时候,使用\0(\0对应的ASCII值是0)进行填充。大家要注意,这里的\0只是起到一个占位或者标识的作用,我们是无法通过printf等打印输出到控制台的(不支持输出)。

比如:

cpp 复制代码
 char c[8] = {'h','e','l','l','o'}; //一维的字符数组的初始化,未初始化部分补'\0'或者0
 char c[8] = {'h','e','l','l','o','\0','\0','\0'};

案例1

案例1
  • 需求:输出一个字符序列(I LOVE YOU)

  • 代码:

    cpp 复制代码
    /*************************************************************************
       > File Name:    demo03.c
       > Author:       阮
       > Description:  
       > Created Time: 2025年07月19日 星期五 14时29分35秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建一个数组,用来存储I LOVE YOU   空格' '也是字符,对应的ASCII 为 32
         char arr[] = {'I',' ','L','O','V','E',32,'Y','O','U'};  
     ​
         // 计算数组的大小
         int len = sizeof(arr) / sizeof(arr[0]);
     ​
         // 遍历数组
         for (int i = 0; i < len; i ++) printf("%c",arr[i]);
     ​
         printf("\n");
     ​
         return 0; 
     }
     ​

结果:

案例2
  • 需求:输出一个用字符*组成的空菱形图案。

  • 代码:

cpp 复制代码
/*************************************************************************
   > File Name:    demo04.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月19日 星期五 14时40分11秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 创建一个二维数组,存放菱形
     char arr[5][5] = {
         {' ',' ','*',' ',' '},
         {' ','*',' ','*',' '},
         {'*',' ',' ',' ','*'},
         {' ','*',' ','*',' '},
         {' ',' ','*',' ',' '}
     };
 ​
     // 计算行和列的大小
     int row_len = sizeof(arr) / sizeof(arr[0]);
     int col_len = sizeof(arr[0]) / sizeof(arr[0][0]);
 ​
     // 遍历数组
     for (int i = 0; i < row_len; i++)
     {
         for (int j = 0; j < col_len; j++) printf("%c",arr[i][j]); printf("\n");
     }
 ​
     printf("\n");
 ​
     return 0;
 }
复制代码
结果:
注意
  • 如果定义时,不初始化,元素值不确定(局部作用域)

    cpp 复制代码
     char arr1[2];   // 此时,这个数组中元素的值是随机值
     char arr2[3] = {'a','b','c'}; // 此时属于部分初始化,未初始化的元素使用 \0 填充
     char arr3[3] = {};  // 此时所有的元素使用 \0 填充
     char arr4[3] = {0}; // 此时所有的元素使用 \0 填充
  • 如果提供的字符个数大于数组长度,则按照语法错误处理(会报警告,但是能编译通过);如果字符个数小于数组长度,后面的元素自动补\0

    cpp 复制代码
     char arr1[2] = {'h','e','e'};   // 编译通过,但是会报警告(warning),不建议写,实际存放的是 he
     char arr2[3] = {'a'};           // 正确写法,部分初始化,未初始化部分补 \0
  • 如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素的个数,适合字符较多时。

    cpp 复制代码
     char arr1[] = {'b','u'}; // 正确,根据初始化元素,由系统自动计算元素个数
字符串结束标志

说明

  • C语言规定,字符串常量以字符\0作为结束标志。

  • 编译系统对字符串常量自动加一个\0作为结束标志。 char *name = "tom",实际存储为{'t','o','m','\0'}

  • 程序中往往通过判断\0来检测字符串是否结束。举例:while(arr[i] != '\0'){..}

  • \0的ASCII码是0,不是一个可显示可输出的字符,是"空操作符"。它什么都不做,不会增加有效字符,仅仅用作一个工程判别的标志或者在数组中占位。

    cpp 复制代码
     char a[] = {'h','i'};        // 输出:hi
     char a[] = {'h','i','\0'};   // 输出:hi
     char c[] = "hello";          // 输出:hello,实际存储:hello\0  将字符串常量赋值给字符数组   
字符数组的多样表示

我们的char数组可以以数组的形式一个一个输出每个字符;也可以以字符串的形式整体输出。

  • 演示:
cpp 复制代码
/*************************************************************************
   > File Name:    demo05.c
   > Author:       阮
   > Description:  
   > Created Time: 2025年07月19日 星期五 15时31分37秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 字符串的第1种表示:
     char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};// 字符个数:12
     // 字符串的第2种表示:
     char s2[] = {"hello world"};// ""包裹的内容是字符串常量,字符串常量默认末尾有一个\0  字符个数:12
     // 字符串的第3种表示:
     char s3[] = "hello world"; // 字符个数:12
 ​
     // 字符串的第1种输出:
     // 计算字符串所占字节数
     printf("s1=%lu,s2=%lu,s3=%lu\n", sizeof(s1), sizeof(s2), sizeof(s3)); // s1=12,s2=12,s3=12
 ​
     // 计算数组大小
     int len = sizeof(s3) / sizeof(s3[0]);
 ​
     // 遍历
     for (int i = 0; i < len; i++)
     {
         // 过滤\0
         if (s1[i] == 0 || s2[i] == '\0' || s3[i] == 0) continue;
 ​
         printf("%c,%c,%c\n", s1[i], s2[i], s3[i]);
     }
     printf("\n");
 ​
 ​
     // 字符串的第2种输出:
     printf("%s,%s,%s\n",s1,s2,s3);
     printf("\n");
 ​
     return 0;
 }
复制代码
结果:
注意
  • 字符串的长度与字符数组的长度不一定相同。

    cpp 复制代码
     char name[] = "hello";  // 数组长度:6,字符串长度:5
  • 利用字符串常量可以对字符数组进行初始化,但不能用字符串常量对字符数组赋值。

    复制代码
      // 正确演示:利用字符串常量给字符数组初始化
    cpp 复制代码
     char arr1[] = "hello";
    复制代码
    // 错误演示:利用字符串常量给字符数组赋值
    cpp 复制代码
     char arr2[6];
      arr2 = "hello";  // 可以理解为,数组是一个常量

章节作业

一维数组练习题

  1. 键盘录入一组数列,利用冒泡排序将数据由大到小排序

  2. 从键盘输入年、月、日,计算并输出该日是该年第几天

  3. 键盘录入一组数列,求最大数、最小数、均值

  4. 从键盘录入一组数列,判断是否是回文,举例:12321,abba,121

  5. 用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值

  6. 通过键盘输入 10 个学员成绩: 1)输出不及格学员的成绩和下标。 2)求最高分的下标值 3)求最低成绩的下标值 4)求总成绩及平均成绩

二维数组练习题

  1. 一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则提示。

  2. 二维整型数组,求所有元素平均值,求每行最大值,求每列最小值。

  3. 在行列相等数组计算主对角线元素的和

  4. 计算一个矩阵下三角元素的和

  5. 电影院为了答谢影迷的支持,在某一排的某一列座位上放置了一个大礼包,放置礼物的位置具有这样的规则(行和列的平方和为开店日期 512(5月12日)); 请设计程序找出大礼包的位置,(假定电影院有20排,每排25个座位)

字符数组练习题

  1. 编写一个程序,读取用户输入的字符串,并将其反转输出。

  2. 编写一个程序,判断用户输入的字符串是否为回文(即正反读都一样的字符串)。

思考题【选做】

  1. 求出一个矩阵的鞍点。鞍点的含义为行上最大同时列上也最大。
相关推荐
云天徽上3 分钟前
【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏
开发语言·python·华为·信息可视化·数据分析·pyecharts
AMiner:AI科研助手4 分钟前
警惕!你和ChatGPT的对话,可能正在制造分布式妄想
人工智能·分布式·算法·chatgpt·deepseek
极客小张1 小时前
【项目思路】基于STM32+ZigBee的智能家居--浴室场景设计
c语言·python·stm32·智能家居·课程设计·项目设计·企业项目
墩墩分墩3 小时前
【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
开发语言·后端·golang·go
深耕AI3 小时前
【MFC中OnInitDialog虚函数详解:哪个是虚函数?两个OnInitDialog的关系】
c++·mfc
CHANG_THE_WORLD3 小时前
并发编程指南 同步操作与强制排序
开发语言·c++·算法
pl00204 小时前
C++虚函数&虚析构函数&纯虚函数的使用说明和理解
c++·虚函数·纯虚函数·虚析构函数
仰泳之鹅4 小时前
【C语言】深入理解指针(5)
c语言·开发语言
gaoshou454 小时前
代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字
数据结构·算法