首页 > 其他分享 >C语言 11 字符串

C语言 11 字符串

时间:2024-09-13 10:47:09浏览次数:9  
标签:11 字符 0000 字节 C语言 char 表示 字符串

前面学习了数组,而对于字符类型的数组,比较特殊,它实际上可以作为一个字符串(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 007F 0xxxxxxx
0000 0080 ~ 0000 07FF 110xxxxx 10xxxxxx
0000 0800 ~ 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 ~ 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

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

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

标签:11,字符,0000,字节,C语言,char,表示,字符串
From: https://www.cnblogs.com/skysailstar/p/18411814

相关文章

  • 鹏哥C语言(进阶)27-30---循环语句 while
    #define_CRT_SECURE_NO_WARNINGS//--------------------------------------------------------------------------------------------------------------3.循环语句//while //for//dowhile#include<stdio.h>//------------------------------------------------......
  • C语言----使用链表实现的客户管理系统
    实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。学完了C语言和链表没事情干拿出来写一写,检测下学习成果#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructNode{intnum;charname[20];chargender;......
  • 第七章习题5-写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
     ......
  • C语言写俄罗斯方块游戏
    编写一个完整的俄罗斯方块游戏涉及到许多细节,包括方块的旋转、移动、消除行等。下面提供一个简化版的俄罗斯方块游戏实现,这个版本主要集中在游戏的核心逻辑上,并且为了简化,没有使用图形界面,而是通过控制台输出来显示游戏状态。首先,我们需要定义一些基本的结构体来表示方块和......
  • C语言实现一个24点游戏
    定义扑克牌的值,其中A=1或14(在这个上下文中我们通常认为A=1),J=11,Q=12,K=13。随机选择4张牌。使用递归算法来尝试所有可能的组合来达到24点。输出结果或提示玩家输入表达式。下面是一个简化版的示例代码,展示如何随机选取四张牌并检查是否能通过运算得到24。注意,这里的代码不包......
  • 【Python学习笔记】 第7章 字符串基础
    本章范围本章主要讲str字符串类型,有关的操作适用于Unicode处理。Unicode简介ASCII是Unicode的简单形式,但Unicode适用于非英语地区的人们。两者在文件中的编码不同。在Python3.X中,有三种字符串类型:str用于Unicode文本,bytes用于二进制数据,bytearray是bytes的一种可修改的变体......
  • 百度地图SDK Android版开发 11 覆盖物示例 4 线
    百度地图SDKAndroid版开发11覆盖物示例4线前言界面布局MapPolyline类常量成员变量初始值创建覆盖物移除覆盖物设置属性加载地图和释放地图MapPolylineActivity类控件响应事件运行效果图前言文本通过创建多个不同线宽的折线和大地曲线,介绍Polyline的使用方法。......
  • C语言数据类型、变量及数据类型的长度、取值范围
    文章目录一、数据类型介绍1.字符型2.整型3.浮点型4.布尔类型二、变量1.变量的创建2.变量的分类三、数据类型的长度(字节)1.sizeof操作符2.各种数据类型的长度3.sizeof中表达式不计算四、各种类型的取值范围1.signed和unsigned2.数据类型的取值范围五、整型提升练习1......
  • 0910-0911 shell编程与基础算法(leetCode )
    栈的定义栈(Stack),也称为堆栈,它是一种特殊的线性表,只允许在表的一端进行插入和删除操作。允许在表操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈顶是动态变化的,它由一个称为栈顶指针(top)的变量指示。当表中没有元素时,称为空栈。栈的插入操作称为入栈或进栈,删除操作称为出栈或......
  • 代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍
    513.找树左下角的值题目链接:513.找树左下角的值文档讲解︰代码随想录(programmercarl.com)视频讲解︰找树左下角的值日期:2024-09-12想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。Java代码如下://迭代classSolut......