欢迎光临散文网 会员登陆 & 注册

C语言实现定义字符串(鸡肋)

2022-09-14 04:30 作者:凫水亿  | 我要投稿

众所周知,在 C 语言中是没有字符串类型的,今天 up 主为大家提供一种思路,也是为了保住自己即将掉落的秀发而作的一丁点努力。

字符概念

在计算机中,所有的数据都是由 0 与 1 组成的,0 与 1 向上建造了指令与数据,字符是万千个 0 与 1 映射的数据。计算机的硬件中流淌着除了指令就是数据这两种类型,指令所作的工作就是搬运数据,然后交由 CPU 或者其他处理器处理数据,最后将数据输出到人们的感官中,供人们学习、工作、娱乐;

在 ASCII (美国信息交换标准代码) 中,定义了一组字符映射表,使用十进制的 0~127 ,也就是 7 位( bit ) 代表了包含,控制字符,数字( 0~9 ),小写字母,大写字母在内的键盘上绝大多数字符。通俗的来说,ASCII 字符集,就是使用数字代表字符。以下是表的一部分:

ASCII小写字母

于是我们得到:

其中 demo 变量就储存着字符 'a'

查看输出:

不同的字符集有着不同储存规则,具体看其实现。

字符串

字符串,顾名思义,由多个字符按照顺序串成一条,通常意义上来说其结尾包含 \0 字符。在 C 中使用 char * 定义字符串,如定义一个常量字符串,char *demo1 = "hello world"; 字符串存储在常量区,其结尾自动的被添加了 \0 字符,并无法更改字符串中的任何一个字符,使用 char demo[] = "hello world"; 效果是一样的,如果想要使用可改变的字符串(字符数组),那么需要提前得知字符串的长度,字符串又不会开口说话,然后告诉我们它的长度,那么怎么办?有一种鸡肋的办法,那将上面两种定义产生的字符串,复制到栈上来。

实现原理

定义一个字符串,等待被复制,获取被复制字符串的长度,分配该长度的内存空间,将字符串复制到分配的空间中,最后将字符数组地址赋值给新的字符指针中。这样鸡肋的行为,我只能一个字,绝!

我们先用语句实现:

需要使用到的头文件

在全局区定义 string 类型

在全局区定义临时字符指针

定义过渡宏 _Dest_TEMP

在main函数中实现

第二行中,值依次从右往左进行传递。alloca为gcc 内置函数,功能是在栈上分配内存。

最后的 _Dest_TEMP = NULL;将中间变量初始化,防止误用。

接下来输出 demo变量,然后改变demo[1]的字符,我们在来看看是否被改变。

结果表明,字符串可以被改变

代码全貌

我们将优化以下代码,将碎片整理到 stack.h 头文件中

使用的时候,包含 stack.h 头文件,并且在全局区定义 _Dest_TEMP_GLOBAL 即可,string _Dest_TEMP_GLOBAL = ((void *)0); 

举例

至此,可以愉快的使用 stack 宏在栈上定义字符串了。

鸡肋的地方

浪费了内存空间,这种做法会产生两个相同的字符串;占用变量名,变量_Dest_TEMP_GLOBAL 不能再被定义,也不能被其他语句使用;需要 gcc 支持 alloca 内置函数,up 使用的两个gcc 版本都支持:8.5、12.1.0;对于特定的平台可能行不通,因为硬件上的内存是有限的,或者某些平台可能对栈设置了固定大小。


C语言实现定义字符串(鸡肋)的评论 (共 条)

分享到微博请遵守国家法律