3 回答
TA贡献1818条经验 获得超7个赞
以零结尾的字符串是连续的字符序列,最后一个字符的二进制位模式全为零。我不确定“通常的字符串”是什么意思,但是如果您的意思是std::string,则a std::string不需要(直到C ++ 11)是连续的,并且不需要具有终止符。同样,std::string字符串数据始终由std::string包含它的对象分配和管理;对于以null终止的字符串,没有这样的容器,并且您通常使用裸指针引用和管理这样的字符串。
所有这一切都应该在任何体面的C ++教科书中都涉及到-我建议掌握Accelerated C ++,这是其中最好的之一。
TA贡献1911条经验 获得超7个赞
“字符串”实际上只是char
s 的数组;以null结尾的字符串是其中以null字符'\0'
标记字符串结尾(不一定是数组结尾)的字符串。代码中的所有字符串(由双引号分隔""
)都由编译器自动以空值终止。
因此,例如"hi"
与相同{'h', 'i', '\0'}
。
TA贡献1795条经验 获得超7个赞
表示字符串的主要方法有两种:
1)末尾是ASCII空(nul)字符0的字符序列。您可以通过搜索终止符来知道多长时间。这称为以null终止的字符串,有时也称为以nul终止的字符串。
2)一系列字符,再加上一个单独的字段(整数长度或指向字符串结尾的指针),以告诉您它有多长。
我不确定“通常的字符串”,但是经常发生的是在谈论特定语言时,“字符串”一词用于表示该语言的标准表示形式。因此,在Java中,java.lang.String是2型字符串,因此这就是“字符串”的含义。在C语言中,“字符串”可能表示类型1的字符串。为了精确起见,该标准非常冗长,但是人们始终希望忽略“显而易见的”内容。
不幸的是,在C ++中,这两种类型都是标准的。std :: string是2型字符串[*],但是从C继承的标准库函数对1型字符串起作用。
[*]实际上,std :: string通常实现为字符数组,具有单独的长度字段和 nul终止符。这样一来,c_str()
无需复制或重新分配字符串数据即可实现该功能。我不记得要在不存储长度字段的情况下实现std :: string是否合法:问题是标准需要保证什么复杂性。通常,对于容器,size()
建议将其设置为O(1),但实际上并不需要。因此,即使合法,仅使用nul终止符的std :: string实现也会令人惊讶。
- 3 回答
- 0 关注
- 1192 浏览
添加回答
举报