首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >除了找出字符串的长度之外,还有什么其他的理由来终止字符串吗?

除了找出字符串的长度之外,还有什么其他的理由来终止字符串吗?
EN

Software Engineering用户
提问于 2022-01-03 23:19:23
回答 2查看 389关注 0票数 -2

我已经查看了一些标准C函数的源代码,并想知道除了找出字符串的长度之外,空终止字符串的原因是什么。

例如:

strlcat()函数,它在string.h头中定义。

代码语言:javascript
代码运行次数:0
运行
复制
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。

EN

回答 2

Software Engineering用户

发布于 2022-01-03 23:31:57

根据定义,C-字符串是以零字节结尾的一系列字符.如果没有零字节,那么任何将字符视为C字符串的代码都可能会调用未定义的行为,可能会崩溃甚至更糟。

如果无法确定C字符串的长度,则无法知道任何字符是否是C字符串的一部分。你的问题是“除了会爆炸之外,还有什么其他的理由不把炸药放进烤箱,打开烤箱吗?”

票数 8
EN

Software Engineering用户

发布于 2022-01-04 10:25:01

要严格回答这个问题,除了作为确定字符串长度的一种手段之外,没有其他理由终止字符串。

如果存储固定长度的字符串,则不需要空终止符,其确切长度在编译时是固定的。

但是,如果您想要一个可变长度的字符串,在处理它时必须有某种方法来标识它的长度。Pascal使用整数前缀。C使用空终止符。

另外,字符串基本上是一个字符数组(传统上,字符基本上是一个字节长度的整数),同样的一般原则适用于任何数组。

具有固定大小元素的固定长度数组不需要确定其长度的方法,因为它是编译时常数。可变长度数组需要确定其长度的方法。这些选项要么是长度前缀,要么是标记数组结束的哨兵元素。null结束符是标记字符串结束的前哨元素。

票数 6
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/435715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档