我已经查看了一些标准C函数的源代码,并想知道除了找出字符串的长度之外,空终止字符串的原因是什么。
例如:
strlcat()
函数,它在string.h
头中定义。
size_t strlcat(dst, src, siz)
char *dst;
const char *src;
size_t siz;
{
register char *d = dst;
register const char *s = src;
register size_t n = siz;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = siz - dlen;
if (n == 0)
return(dlen + strlen(s));
while (*s != '\0') {
if (n != 1) {
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return(dlen + (s - src)); /* count does not include NUL */
}
为什么行*d = '\0';
是必要的?
即使函数不返回字符串,但返回类型为size_t
的值,该字符串仍然为null。
发布于 2022-01-03 15:31:57
根据定义,C-字符串是以零字节结尾的一系列字符.如果没有零字节,那么任何将字符视为C字符串的代码都可能会调用未定义的行为,可能会崩溃甚至更糟。
如果无法确定C字符串的长度,则无法知道任何字符是否是C字符串的一部分。你的问题是“除了会爆炸之外,还有什么其他的理由不把炸药放进烤箱,打开烤箱吗?”
发布于 2022-01-04 02:25:01
要严格回答这个问题,除了作为确定字符串长度的一种手段之外,没有其他理由终止字符串。
如果存储固定长度的字符串,则不需要空终止符,其确切长度在编译时是固定的。
但是,如果您想要一个可变长度的字符串,在处理它时必须有某种方法来标识它的长度。Pascal使用整数前缀。C使用空终止符。
另外,字符串基本上是一个字符数组(传统上,字符基本上是一个字节长度的整数),同样的一般原则适用于任何数组。
具有固定大小元素的固定长度数组不需要确定其长度的方法,因为它是编译时常数。可变长度数组需要确定其长度的方法。这些选项要么是长度前缀,要么是标记数组结束的哨兵元素。null结束符是标记字符串结束的前哨元素。
https://softwareengineering.stackexchange.com/questions/435715
复制