当前位置:  开发笔记 > 编程语言 > 正文

为什么C中的字符串需要以null结尾?

如何解决《为什么C中的字符串需要以null结尾?》经验,为你挑选了3个好方法。

只是想知道为什么会这样.我渴望了解更多有关低级语言的知识,而且我只是进入C语言的基础知识,这已经让我感到困惑.

像PHP这样的语言会在解释和/或解析时自动为null终止字符串吗?



1> Max Shawabke..:

来自Joel关于这个主题的优秀文章:

记住字符串在C中的工作方式:它们由一串字节后跟一个空字符组成,其值为0.这有两个明显的含义:

没有办法知道字符串结束的位置(即字符串长度)而不移动它,在末尾查找空字符.您的字符串中不能包含任何零.因此,您无法在C字符串中存储任意二进制blob,如JPEG图片. 为什么C字符串以这种方式工作?这是因为发明了UNIX和C编程语言的PDP-7微处理器具有ASCIZ字符串类型.ASCIZ的意思是"最后用Z(零)的ASCII".

这是存储字符串的唯一方法吗?不,实际上,这是存储字符串的最糟糕方式之一.对于非平凡的程序,API,操作系统,类库,您应该避免像瘟疫这样的ASCIZ字符串.



2> Joonas Pulak..:

C字符串是字符数组,C数组只是指向内存位置的指针,它是数组的起始位置.但也必须以某种方式表达数组的长度(或结束); 在字符串的情况下,使用空终止.另一种选择是以某种方式携带字符串的长度与存储器指针一起,或者将长度放在第一个数组位置,或者其他什么.这只是一个惯例问题.

Java或PHP等高级语言可以自动,透明地存储数组的大小信息,因此用户无需担心它们.



3> Morfildur..:

C本身没有字符串的概念.字符串简单字符的阵列(或wchars为Unicode和这样).

由于这些事实,C无法检查字符串的长度,因为没有"mystring-> length",因此没有设置长度值.找到字符串结尾的唯一方法是迭代它并检查\ 0.

C的字符串库使用类似的结构

struct string {
    int length;
    char *data;
};

删除\ 0-termination的需要,但这不是标准C.

像C++,PHP,Perl等语言有自己的内部字符串库,它们通常具有单独的长度字段,可以加速某些字符串函数并消除对\ 0的需要.

其他一些语言(如Pascal)使用一种被称为(令人惊讶的)Pascal String的字符串类型,它将长度存储在字符串的第一个字节中,这就是为什么这些字符串限制为255个字符的长度的原因.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有