为什么"字符串",即字符数组,有一个空终止元素,而整数数组不是?

时间:2014-11-29 02:38:53

标签: c++ c

根据我的理解,C / C ++中的字符数组有一个空终止字符,用于表示该数组的off-the-end元素,而整数数组则没有;他们有一些隐藏在用户身上的内部机制,但他们显然知道自己的大小,因为用户可以sizeof(myArray)/sizeof(int)(技术上是黑客吗?)。如果整数数组有一些空终止int - 将其称为i或其他东西,这是不是有意义?

这是为什么?它从未对我有任何意义。

5 个答案:

答案 0 :(得分:4)

string中不存在c

因为null terminator用于标记input的结尾,并且它不必是给定数组的长度。

答案 1 :(得分:4)

因为在C中,字符串与字符数组相同,所以它们存在于以上数组的级别,其方式与链接列表存在于水平高于结构。

这是字符串的示例:

"pax is great"

这是一个字符数组的例子:

{ 'p', 'a', 'x' }

这是一个恰好等同于字符串的字符数组的示例:

{ 'p', 'a', 'x', '\0' }

换句话说,C字符串构建在字符数组的 top 上。

如果你以另一种方式看待它,既不是整数数组也不是"真实的"字符数组(例如{'a', 'b', 'c'})具有终止字符。

使用-1(或任何负数)作为终结符,你可以很容易地做同样的事情(有一个终结符)和整数数组的人。

唯一的区别是,您将编写自己的代码来处理它,而不是使用C标准库中提供的代码,例如:

size_t agelen (int *ages) {
    size_t len = 0;
    while (*ages++ >= 0)
        len++;
    return len;
}

int *agecpy (int *src, int *dst) {
    int *d = dst;
    while (*s >= 0)
        *d++ = *src++;
    *dst = -1;
    return dst;
}

答案 2 :(得分:0)

按照惯例,将null视为非字符。与那时的其他主要系统软件语言不同。 PL / 1有一个前导整数来表示可变长度字符串的长度,C被设计为将字符串视为简单的字符数组,并且不需要开销,特别是任何可移植性问题(例如sizeof int)或任何限制(非常长的字符串)。该公约已经停滞不前,因为它运作得相当好。

如您所建议的那样,表示int数组的结尾将需要非Int标记。这可能很难安排。你正在弄清楚int数组的大小只是利用你对* alloc的了解 - 在C中绝对没有任何东西可以阻止你通过巧妙管理分配的内存来拼凑“数组”。现代编译器当然包含对任意代码的许多便利检查,而对编译器有更好了解的人可以在这里澄清/纠正我的评论。例如,C ++ Vector包含对数组容量的明确知识。

很多地方可以看到用于分隔字符串的不同字段分隔符FS字符。例如,CSV。但如果你这样做,你需要编写自己的std库 - 成千上万行经过测试的良好代码。

答案 3 :(得分:0)

C样式字符串是由' \ 0'终止的字符集合。它不是不是一个数组。

集合可以像数组一样编制索引。

由于集合的长度可能不同,因此必须通过计算集合中的字符数来确定长度。

方便的表示是一个数组,因为数组也是一个集合。

一个区别是数组是固定大小的数据结构。字符集可能不是固定大小;例如,它可以连接。

答案 4 :(得分:0)

如果你想到如何表示字符串的问题,你有两个选择:1)存储字母后跟字母的数量;或2)存储字母后跟一些独特的特殊字符作为字符串标记的结尾

字符串结束标记更灵活 - 可以使用更长的字符串,更易于使用等等。

顺便说一句,如果你愿意的话,你可以在一个int数组上使用终结符...没有什么可以阻止你说-1例如意味着列表的结尾,只要你确定-1是唯一的。