C语言中的匕首

- C风格字符串

原创IT之州2021-02-06 11:44:22

不同于其他主流编程语言,C语言本身对于字符串的处理采用了独特的设计,被称为C风格的字符串,以区别于C 创立的字符串string。

设计

C风格字符串由一串字符在内存里顺序存放,在最后一个字符串后追加一个终止字符。这充分条件体现了C语言哲学 - 简单的事情简单化。

例如字符串'Hello world!',用C语言定义是这个样子的。

char str2[] = 'Hello world!'; /* str2字符串的长度可以省略,由编译器自行处理 */

C语言中的字符串本质上是字符数组,它的特别之处在于,在末尾字符'!'后,必须追加一个终止字符'\0',才能成为一个有效的C-风格字符串。记住这点!

在常见的计算机中,C语言的字符类型占用1个字节。不难看出,C风格字符串在计算机里的存储空间总是字符串长度加1。例如'hello'字符串所需要的存储空间是6个字节。对比之下,C 的string类将占用24个字节。

示例代码

#include <iostream>#include <cstdio>#include <string>int main(){char sp1[] = 'hello';std::string sp2 {'hello'};printf('c-style string: %s. size = %zu\n', sp1, sizeof(sp1));std::cout << 'c   string: ' << sp2 << '. size = ' << sizeof(sp2) << '\n';return 0;}

运行结果为:

c-style string: hello. size = 6c string: hello. size = 24

当然,我们不能据此认为C 的std::string不好!std::string作为类,具有类的种种好处,同时支持unicode,还内置了很多成员函数。

C风格字符串的优势在于紧凑存储空间,高效存取,与C语言指针高度融合。运用之妙,存乎于心。我们要善于利用C风格字符串的优势,选择性地在C和C 中使用它。C风格字符串就好比匕首,便携方便,握在行家手里,是致命的武器。

存取

如何存取C风格字符串呢?由于C风格字符串在内存中是顺序存放,那么用指针和指针偏移量就能高效存取字符串内容。请看:

char str1[4] = '123';assert(str1[0] == '1');assert(str1[1] == '2');assert(str1[2] == '3');assert(str1[3] == '\0');str1[3] = '4';  printf('%s', str1);  /* 打印字符串,值为124 */

字符串str1的指针名就是str1。这是C语言设计者给予我们的礼物。str1[1]的意思是调取str1指针偏移1指向处,这相当于*(str1 1)。

常见问题

C语言初学者往往难以驾驭C风格字符串。究其原因无外乎两点,

1)忘记为字符串的末尾的终止符分配内存;

char str1[3] = '123'; /* 错误。忘记为终止字符分配空间 */

2)对字符串操作时忘记处理末尾的终止字符。

例如,拷贝一个字符串的前两个字符到新字符串。示例代码如下

char source[64] = 'hello world';char dest[64];int copy_chars = 2;strncpy(dest, source, copy_chars); dest[copy_chars] = '\0';   /* 必须的一步! */

假如少了最后一步,那么dest不是预期的C风格代码!后果非常严重。

“C语言程序员知道自己在干什么” --C语言之父丹尼斯瑞奇。

其实,只要牢记两点,就能使用C风格字符串这把匕首。

1)总是为末尾终止符分配内存空间

2)处理C风格字符串时,记得处理好末尾的终止字符

(0)

相关推荐

  • UC头条:竟然可以这样学python! !

    本人最近刚刚学习了python,想要了解python的朋友可以跟我一起学哦~ 点击加载图片 先来个最简单的程序 print('Hello World!') 其实python也是支持中文版的,可以直接使 ...

  • Tcl中的字符串处理

    string bytelength str返回用于存储字符串的字节数,由于UTF-8编码的原因,或许与string length返回的字符长度有所不同string compare ?-nocase? ...

  • C语言中的匕首-C风格字符串(续)

    https://m.toutiao.com/is/JwmYg8w/ 本文接续<C语言中的匕首 - C风格字符串>. 让我们展开聊聊C风格字符串的常见操作. 字符串比较 比较两个字符串,凭借 ...

  • Shell字符串截取(非常详细)

    Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取. 从指定位置开始截取 这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串. 既 ...

  • C#几个经常用到的字符串截取

    一. 1.取字符串的前i个字符 (1)string str1=str.Substring(0,i); (2)string str1=str.Remove(i,str.Length-i); 2.去掉字符 ...

  • Tcl字符串命令string

    string string option arg ?arg ...? 操作字符串,具体操作由option决定,option支持以下选项: compare string compare ?-nocase ...

  • 初学编程,如何玩转C语言?C语言中最重要的知识献上!

    一.C语言的指针 1.指针说明 指针是包含另一变量的地址变量. (1)int *p p是一个指针,指向一个整形数. (2)int *p() p是一个函数,该函数返回一个指向整数的指针. (3)int ...

  • c语言中结构体成员变量使用“.”符号赋值方法

    在C语言中定义结构体类型的变量时,其内部的成员变量赋值除常规的方法外,也可以通过点号"."进行赋值,如下图所示: 备注:在Linux系统上使用gcc / g++编译器调试通过,其它 ...

  • 注意:你语言中的能量将改变你的命运

    注意:你语言中的能量将改变你的命运 语言中有一种无形的力量,它无时无刻地都在影响着我们自己的生活.大部分人都没有意识到这点. 我们说出来的话是建设生命的基础,我们一直在说话却很少思考自己说话的方式:或 ...

  • R语言中的偏最小二乘回归PLS-DA

    原文链接:http://tecdat.cn/?p=8890 主成分回归(PCR)的方法 本质上是使用第一个方法的普通最小二乘(OLS)拟合来自预测变量的主成分(PC).这带来许多优点: 预测变量的数量 ...

  • 五种爱的语言测试,测试你的爱的语言中哪一种是你在爱情中的弱点

    你首先在这个性格测试中看到的,揭示了五种爱的语言中哪一种是你在爱情中的弱点 如果你有任何约会.爱情和人际关系方面的经验,你就会知道有无数关于自助和心理学的书籍可以在事情没有像你希望的那样顺利进行时指导 ...

  • 逻辑普及:日常语言中的谬误(连载10)

    刘新文老师.万千教育授权发布 哲学园鸣谢 选自<逻辑学基础> 著者:(美)帕特里克·J. 赫尔利(Patrick J. Hurley) 译者:郑伟平,刘新文 出品:万千教育 非形式谬误   ...

  • R语言中进行期权定价的Heston随机波动率模型

    原文链接:http://tecdat.cn/?p=12111 在本文中,我将向您展示如何模拟股票价格的Heston随机波动率模型. Heston模型是一种期权估值方法,它考虑到同一资产在给定时间交易的 ...

  • 烂话是语言中的病毒,你要学会分辨烂话。

    烂话是语言中的病毒,你要学会分辨烂话。