C语言 11 字符串

news2025/1/12 12:26:23

前面学习了数组,而对于字符类型的数组,比较特殊,它实际上可以作为一个字符串(String)表示,字符串就是一个或多个字符的序列,比如在一开始认识的"Hello World",像这样的多个字符形成的一连串数据,就是一个字符串,而printf函数接受的第一个参数也是字符串。

在 C 语言中并没有直接提供存储字符串的类型,能够存储字符的只有 char 类型,但是它只能存储单个字符。

一连串的字符想要通过变量进行保存,就只能依靠数组了,char 类型的数组允许存放多个字符,这样的话就可以表示字符串了。

比如现在想要存储Hello这一连串字符:

#include <stdio.h>

int main() {
    // 直接保存单个字符
    // 但是注意,无论内容是什么,字符串末尾必须添加一个 '\0' 字符(ASCII码为0)表示结束
    // 如果不加 '\0' 字符,则会在末尾产生 + 号,比如下面的字符串的结果为 Hello+
    // char str[] = {'H', 'e', 'l', 'l', 'o'};
    char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    // 用%s来作为一个字符串输出
    printf("%s", str);
}

不过这样写起来实在是太麻烦了,可以使用更加简便的写法:

#include <stdio.h>

int main() {
    // 直接使用双引号将所有的内容囊括起来,并且也不需要补充\0(但是本质上是和上面一样的字符数组)
    char str[] = "Hello";   
    // 也可以添加 const char str[] = "Hello";
    // 双引号囊括的字符串实际上就是一个const char数组类型的值
    printf("%s", str);
}

这下终于明白了,原来一直在写的双引号,其实表示的就是一个字符串。

那么现在看看下面的写法有什么不同:

"c"
'c'

发现一个问题,char 类型只能保存 ASCII 编码表中的字符,但是实际上中文也是可以正常打印的:

printf("你好 世界");

这是什么情况?那么多中文字符(差不多有 6000 多个),用 ASCII 编码表那 128 个肯定是没办法全部表示的,但是现在需要在电脑中使用中文。这时,就需要扩展字符集了。

可以使用两个甚至多个字节来表示一个中文字符,这样能够表示的数量就大大增加了,GB2132 方案规定当连续出现两个大于 127 的字节时(注意不考虑符号位,此时相当于是第一个bit位一直为1了),表示这是一个中文字符(所以为什么常说一个英文字符占一字节,一个中文字符占两个字节),这样就可以表示出超过 7000 种字符了,不仅仅是中文,甚至中文标点、数学符号等,都可以被正确的表示出来。

不过这样能够表示的内容还是不太够,除了那些常见的汉字之外,还有很多的生僻字,比如龘、錕、釿、拷这类的汉字,后来干脆直接只要第一个字节大于 127,就表示这是一个汉字的开始,无论下一个字节是什么内容(甚至原来的128 个字符也被编到新的表中),这就是 Windows 至今一直在使用的默认 GBK 编码格式。

虽然这种编码方式能够很好的解决中文无法表示的问题,但是由于全球还有很多很多的国家以及很多很多种语言,所以最终目标是能够创造一种可以表示全球所有字符的编码方式,整个世界都使用同一种编码格式,这样就可以同时表示全球的语言了。所以这时就出现了一个叫做 ISO(国际标准化组织)的组织,来定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做 Unicode,规定每个字符必须使用俩个字节,即用 16 个 bit 位来表示所有的字符(也就是说原来的那 128 个字符也要强行用两位来表示)

但是这样的话实际上是很浪费资源的,因为这样很多字符都不会用到两字节来保存,但是又得这样去表示,这就导致某些字符浪费了很多空间。所以最后就有了 UTF-8 编码格式,区分每个字符的开始是根据字符的高位字节来区分的,比如:
用一个字节表示的字符,第一个字节高位以 0 开头
用两个字节表示的字符,第一个字节的高位为以 110 开头,后面一个字节以 10 开头
用三个字节表示的字符,第一个字节以 1110 开头,后面两个字节以 10 开头
用四个字节表示的字符,第一个字节以 11110 开头,后面的三个字节以 10 开头

如果程序需要表示多种语言,最好采用 UTF-8 编码格式

10000011 10000110

这就是一个连续出现都大于 127 的字节(注意这里是不考虑符号位的)

Unicode符号范围(十六进制)UTF-8编码方式(二进制)
0000 0000 ~ 0000 007F0xxxxxxx
0000 0080 ~ 0000 07FF110xxxxx 10xxxxxx
0000 0800 ~ 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000 ~ 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

简而言之,中文实际上是依靠多个 char 来进行表示的。

这样,就了解了字符串的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何编写智能合约——基于长安链的Go语言的合约开发

场景设计&#xff1a;文件存证系统 在数字化时代&#xff0c;文件存证和版本追踪变得越来越重要。设想一个场景&#xff1a;在一个法律事务管理系统中&#xff0c;用户需要提交和管理各种文件的版本记录&#xff0c;以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…

抖音生活服务是干什么的?很多人都不知道的入局途径曝光!

近年来&#xff0c;作为国内两大头部短视频平台之一的抖音一直在大力布局其生活服务业务&#xff0c;壮大自身实力的同时&#xff0c;也让不少人开始好奇抖音生活服务的概念&#xff0c;以抖音生活服务是干什么的和如何做抖音生活服务为代表多个相关话题因此成为了多个互联网社…

客户端负载均衡Ribbon实例

文章目录 一&#xff0c;概述二&#xff0c;实现过程三&#xff0c;项目源码1. 源码放送&#xff1a;2. 部署方式 四&#xff0c;功能演示五&#xff0c;其他 一&#xff0c;概述 一般来说&#xff0c;提到负载均衡&#xff0c;大家一般很容易想到浏览器 -> NGINX -> 反…

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目&#xff0c;机房到期&#xff0c;需要迁移至其他机房&#xff1b; 此项目已经运行了3年多&#xff0c;fastdfs累计数据大概在250G 左右&#xff0c;现需要把旧的fastdfs数据迁移到新的fastdfs上&#xff1b; 采用scp物理迁移数据的方式&#xff0c;停机迁移…

技术分享 | RK3568修改eMMC分区大小

我司IAC-RK3568-CM根据eMMC大小的不同&#xff0c;有着不同规格的产品&#xff0c;不论eMMC大小如何改变&#xff0c;其分区的配置大同小异&#xff0c;除了eMMC厂商所使用的区域无法变更外&#xff0c;留给用户的区域可自由写入。 我司产品默认eMMC启动&#xff0c;所以eMMC用…

【AI-18】Adam和SGD优化算法比较

Adam&#xff08;Adaptive Moment Estimation&#xff09;和 SGD&#xff08;Stochastic Gradient Descent&#xff0c;随机梯度下降&#xff09;是两种常见的优化算法&#xff0c;它们在不同方面有各自的特点。 一、算法原理 SGD&#xff1a; 通过计算损失函数关于每个样本的…

干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性

前言 风场信息的测量是气象或空气动力学领域的重要工作内容之一&#xff0c;其测量的精确性对于气象研究尤为重要。 激光测风雷达作为新型测风技术&#xff0c;利用多普勒&#xff08;Doppler&#xff09;原理获取风向、风速信息&#xff0c;具有能够探测晴空风场、测风范围广…

element select + tree

element select tree的使用 <template slot"action1" slot-scope"text, record, index"><el-select v-model"record.tagValue" multiple placeholder"请选择":filter-method"(e) > filterTree(e, index)" filt…

5分钟配置Nginx?(二)

前言: 此文章分为两个部分。 5分钟搞懂什么是Nginx?(一)-CSDN博客文章浏览阅读82次。2.、那么此时入口的安全性则格外重要,同时因为加强了入口的安全性,后端的web server的安全则可以不用做额外安全工作。因为入口如果破防,后端web server一定破防,如果不…

支付宝开放平台-开发者社区——AI 日报「9 月 13 日」

1 OpenAl推出了一个新的大语言模型一 OpenAl o1 前沿技术瞭望官&#xff5c;阅读原文 新的模型主要体现在下面几个方面&#xff0c;思维链&#xff1a;o1在回答问题前会产生一个内部的思维链&#xff0c;这使得它能够进行更深入的推理。强化学习&#xff1a;通过大规模强化学…

Linux操作系统入门(一)

Linux操作系统是开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹在1991年创建。 Linux操作系统以其强大的性能、稳定性和开放性&#xff0c;赢得了全球用户的广泛认可&#xff0c;从服务器到个人电脑&#xff0c;从超级计算机到嵌入式设备&#xff0c;都有它的身影。作为…

停止向供应商提供您的数据

组织管理其数据基础设施的方式正在发生重大转变。越来越多的公司认识到存储和计算分离的优势&#xff0c;从而获得更好的性能、成本节约和可扩展性。这一趋势是由 AI 和 ML 工作负载日益复杂所推动的&#xff0c;这些工作负载需要灵活、高性能的系统。Databricks 首席执行官 Al…

自定义Spring-start学习笔记

Spring Boot Start的创建和使用 start的工作原理(网图) 1. 设置Maven项目&#xff1a; 创建一个新的Maven或Gradle项目&#xff0c;并在项目的pom.xml文件中添加必要的Spring Boot依赖项和插件。下面以maven项目为例&#xff1a; 创建Spring Boot项目 &#xff0c;并在项目的…

私域流量的价值探索:开源链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序的助力

摘要&#xff1a;本文从渠道视角深入剖析私域流量的特殊价值&#xff0c;探讨其作为一种新的销售渠道所具有的重要意义。同时引入开源链动 21 模式、AI 智能名片和 S2B2C 商城小程序等创新元素&#xff0c;阐述它们如何为私域流量的发展提供新的动力和机遇&#xff0c;进一步提…

UE5安卓项目打包安装

Android studio安装 参考&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ 打开android studio的官网&#xff1a;Download Android Studio & App Tools - Android Developers …

浅谈电动汽车火灾特点及扑救对策研究

0引言 电动汽车火灾事件增多&#xff0c;其特点包括电池高能量密度、快速热释放和烟雾毒性。本文提出应对策略&#xff1a;加强火灾预防&#xff0c;完善电池管理系统&#xff0c;提高电池安全性能&#xff1b;使用干粉灭火器、气溶胶灭火系统等灭火剂&#xff1b;对严重火灾采…

力扣13.罗马数字转整数

4.定义一个哈希存字符和对应的数字 16.定义ans存最终数字 17.定义n存字符串长度 18.开始循环 19.设置value存第一个字符的值 20.如果第一个字符的值小于下一个字符的值&#xff0c;比如IV那么值就是V-I 反之则正常&#xff0b; 最后返回

【实证分析】中国工业经济-数实产业技术融合与企业全要素生产率(2008-2022)

数据简介&#xff1a;本数据参考黄先海和高亚兴老师&#xff08;2023&#xff09;的研究方法&#xff0c;对原文数据进行了年份扩充&#xff0c;更新到了2008-2022年。并按照原文的处理方法对样本进行了清洗和筛选。 数据范围&#xff1a;上市企业层面时间跨度&#xff1a;200…

利用Leaflet.js创建交互式地图:添加Popup

在现代Web开发中&#xff0c;交互式地图已成为展示地理位置数据的强大工具。Leaflet.js是一个开源的JavaScript库&#xff0c;它提供了一个简单易用的界面来创建这样的地图。在本文中&#xff0c;我们将探讨如何使用Leaflet.js创建一个交互式地图&#xff0c;并添加Popup来显示…

配置WSL(单纯记录

[参考链接(https://blog.csdn.net/mustuo/article/details/133960230) 1.开始相关功能 在控制面板-启用或关闭windows功能中 勾选适用于Linux的Windows子系统和虚拟机平台 重启后用管理员权限打开Powershell dism.exe /Online /Enable-Feature /FeatureName:VirtualMachinePl…