字符数组

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

  • 字符数组:

 char name[] = “哪吒”;
  • 字符指针:

 char *name = "娜吒";

概念

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

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

实验:

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

一维数组:

 char 数组名[数组容量];

二维数组:

 char 数组名[行容量][列容量];

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

注意:

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

比如:

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

案例1

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

  • 代码:

    /*************************************************************************> 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 为 32char 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
  • 需求:输出一个用字符*组成的空菱形图案。

  • 代码:

/*************************************************************************> 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;}
结果:

注意
  • 如果定义时,不初始化,元素值不确定(局部作用域)

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

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

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

说明

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

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

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

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

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

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

  • 演示:

/*************************************************************************> 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++){// 过滤\0if (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;}
结果:

注意
  • 字符串的长度与字符数组的长度不一定相同。

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

    // 正确演示:利用字符串常量给字符数组初始化
    
     char arr1[] = "hello";
    // 错误演示:利用字符串常量给字符数组赋值
    
     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. 求出一个矩阵的鞍点。鞍点的含义为行上最大同时列上也最大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91727.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91727.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91727.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

decltype是什么,什么作用?

基本概念decltype 是 C11 引入的关键字&#xff0c;用于推导表达式的类型&#xff0c;且会完整保留类型的细节&#xff08;包括 const、引用 &、指针 * 等&#xff09;。语法:decltype(表达式) 变量名核心特点1.推导依据是表达式本身&#xff0c;而非表达式的结果&#xff…

RPC 与 Feign 的区别笔记

一、基本概念 1.1 RPC&#xff08;Remote Procedure Call&#xff09; 定义&#xff1a;远程过程调用&#xff0c;允许像调用本地方法一样调用远程服务的方法。 本质&#xff1a;跨进程通信&#xff0c;隐藏了底层网络通信的复杂性。 常见实现&#xff1a; Java 原生 RMIDub…

高防IP能够防御CC攻击吗?它具备哪些显著优势?

摘要&#xff1a; 面对日益复杂的网络攻击&#xff0c;高防IP作为重要的安全工具&#xff0c;不仅能防御常见的DDoS攻击&#xff0c;还能有效应对CC攻击。本文将解析高防IP防御CC攻击的原理及其核心优势&#xff0c;帮助读者了解其在网络安全中的关键作用。一、高防IP能否防御C…

TypeScript 类型注解(一)

一、TypeScript 类型注解1、什么是TpyeScript类型注解- 是否还记得TypeScript的两个重要特性&#xff1f;- 类型系统、适用于任何规模- 可以说&#xff0c;TS的类型系统是TS最重要的功能&#xff1b;那么什么是类型注解呢&#xff1f;其实就是在声明变量时&#xff0c;将变量的…

弗兰肯斯坦式的人工智能与GTM策略的崩溃

2025 年上半年已经明确了一件事&#xff1a;B2B 市场营销团队被工具淹没&#xff0c;但缺乏策略。人工智能无处不在。收入领导者在进行无休止的试点。营销团队拼凑各种点解决方案&#xff0c;希望能实现规模扩张。然而&#xff0c;销售线索的增长停滞不前。信誉正在受损。曾经承…

NAND闪存(NAND Flash)是什么?

NAND闪存(NAND Flash)是什么? NAND闪存(NAND Flash)详解 NAND闪存是一种非易失性存储介质(断电不丢失数据),广泛应用于SSD、U盘、手机存储等设备中。NAND Flash 的全称是 “Negative-AND Flash”(与非型闪存),其名称源自其底层存储单元的电路结构——基于**“与非门…

Android性能优化之UI渲染优化

一、UI渲染核心瓶颈深度解析 1. 渲染管线关键阶段阶段CPU工作GPU工作潜在卡顿点Measure计算View尺寸-嵌套布局多次测量Layout计算View位置-频繁重排(Relayout)Draw构建DisplayList指令集-复杂自定义View.onDraw()Sync & Upload资源上传到GPU内存纹理上传大图/未压缩资源Ras…

基于Spring AI Alibaba的智能知识助手系统:从零到一的RAG实战开发

&#x1f4d6; 项目概述 在人工智能快速发展的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术已成为构建智能问答系统的核心技术。本文将详细介绍一个基于Spring AI Alibaba DashScope深度集成的智能知识助手系统的完整开发过程&#xff0c;…

VirtualBox + CentOS:启用 DHCP 获取 IPv4 地址

标题&#xff1a; VirtualBox CentOS&#xff1a;启用 DHCP 获取 IPv4 地址 日期&#xff1a; 2025-07-18 一、问题现象 最小化安装的 CentOS 7 虚拟机里敲&#xff1a; ip addr输出只有 lo 的 127.0.0.1 以及 enp0s3 的 IPv6 链路本地地址&#xff0c;没有 IPv4&#xff0…

Git

Git简介Git 是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件&#xff0c;Git 仓库分为两种:本地仓库:开发人员自己电脑上的 Git仓库。远程仓库:远程服务器上的 Git 仓库。commit: 提交, 将本地文件和版本…

通信算法之294:LTE系统中的整数倍频偏估计

在LTE系统中&#xff0c;整数倍频偏估计主要通过以下方法实现&#xff1a;一、最大似然估计法&#xff08;ML&#xff09;通过遍历预设的整数倍频偏范围&#xff08;如30kHz&#xff09;&#xff0c;将接收信号与本地的PSS序列在不同频偏点上进行相关运算&#xff0c;选择相关峰…

数字人直播:开启直播行业新纪元​

​原始尺寸更换图片p9-flow-imagex-sign.byteimg.com​​在科技日新月异的当下&#xff0c;直播行业正经历着一场深刻变革&#xff0c;数字人直播的兴起&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了直播领域的新征程。数字人直播&#xff0c;是利用先进的人工智能技术&…

朝鲜升级供应链恶意软件XORIndex,再次瞄准npm生态系统

Socket威胁研究团队最新披露&#xff0c;朝鲜国家支持的黑客组织在"传染性面试"攻击活动中采用了新型恶意软件加载器XORIndex&#xff0c;该恶意程序专门通过npm软件包注册表渗透软件供应链。攻击规模与持续性此次攻击并非孤立事件&#xff0c;而是针对开发者、求职者…

Windows 下 VS2019 编译 libevent-2.1.10 库

1. 你需要VS2019 编译好openssl-1.1.1 &#xff0c;这个具体编译或者下载可以参考我的博客openssl生成的库是这两个文件接下来&#xff0c;打开CMake &#xff0c;主要是下面的需要设置好最后Config Generate即可&#xff1b;全部成功生成 22个然后INSTALL右键生成 最后看下生…

Vim多列操作指南

我们在使用 Vim 时&#xff0c;经常需要同时编辑多个文件&#xff0c;或者同一个文件的不同部分。Vim 提供了分割窗口&#xff08;split&#xff09;和垂直分割窗口&#xff08;vsplit&#xff09;的功能&#xff0c;允许我们在同一个 Vim 会话中查看多个缓冲区&#xff08;buf…

Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel

一.百度识图自动上传图片from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver.common.by import By edge_options Options() edge_options.binary_location r"C:\Program Files (x86)\Microsoft\Edge\Applica…

Vue中的refs字段使用记录

这段代码是 Vue.js 中结合 Element UI 等 UI 库的典型表单验证写法&#xff0c;具体含义如下&#xff1a;代码拆解 this.$refs.fromData.validate((valid) > {// 验证后的回调逻辑 })this.$refs.fromData $refs 是 Vue 提供的特殊属性&#xff0c;用于访问模板中通过 ref&qu…

多方案对比分析:后端数据加密策略及实践

多方案对比分析&#xff1a;后端数据加密策略及实践 随着互联网业务对用户隐私和数据安全的要求不断提升&#xff0c;后端系统中对敏感数据的加密保护已成为必备需求。从对称加密、非对称加密到数据库透明加密、应用层字段加密&#xff0c;各种方案各有特点。本文将以方案对比分…

《Java语言程序设计》1.4 复习题

1.4.1 什么是操作系统?列出一些流行的操作系统?操作系统(Operating System)是运行在计算机上的最重要的程序。操作系统管理和控制计算机的活动。通用计算机的流行操作系统有Microsoft Windows、Mac OS以及Linux。如果没有在计算机上安装和运行操作系统&#xff0c;像Web浏览器…

OpenCV图像自动缩放(Autoscaling)函数autoscaling()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对输入图像进行自动缩放&#xff08;Autoscaling&#xff09;&#xff0c;即根据输入图像的像素值范围将其线性映射到一个新的范围内&am…