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