c - strlen() 如何计算当前函数中未定义的字符串的长度?

标签 c string strlen

据我了解,在 C 中,数组和指向字符串的指针并不隐式包含有关相应数组中元素数量的信息。这就是为什么 argc必须传递给 main()除了argv .但是,在我的机器上,以下代码确实正确打印了字符串的长度 "Hello"这是5即使该字符串未在与 printf() 相同的范围内定义.

#include <stdio.h>
#include <string.h>

void p1(char *a)
{
    printf("%lu\n", strlen(a));
}

void p2(char a[])
{
    printf("%lu\n", strlen(a));
}

int main(int argc, char *argv[])
{
    char *a = "Hello";
    char b[] = "Hello";
    char c[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    char d[] = {'H', 'e', 'l', 'l', 'o'};

    p1(a);
    p2(a);

    printf("\n");

    p1(b);
    p2(b);

    printf("\n");

    p1(c);
    p2(c);

    printf("\n");

    p1(d);
    p2(d);

    return 0;
}

这是我的结果和机器类型:

$ ./a.out
5
5

5
5

5
5

6
6

$ uname -a
Linux loathe 3.16.0-37-generic #51-Ubuntu SMP Tue May 5 13:45:59 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 14.10 \n \l

如何strlen()确定字符串长度?为什么即使当字符串作为指针显式发送时,这仍然有效,如函数调用函数 p1(a) ?如果此行为仅出现在较新版本的 gcc 中和 clang , 它什么时候开始的,我可以在我的程序中依赖它吗?


编辑:

此外,为什么 strlen()当空字节不包含在字符串中时报告一个额外的字符? (编辑中添加)

编辑:我已经解决了 strlen() 的断言通过查找空字节来工作。

最佳答案

How is strlen() determining the string length?

strlen() 搜索终止的 null ('\0'),并计算字符数(即字节数) , 从开始(指针),直到 null,不包括 null 本身。

请记住,C 风格的字符串根据定义以 null 结尾。

请注意,由于 strlen() 的返回类型为 size_t,因此应使用 %zu 格式说明符来打印返回值。


编辑:

如果 char 数组不是以 null 结尾的,则有资格被称为字符串。在任何与 string 相关的库函数中使用这种数组肯定会调用 undefined behaviour .

有关更多信息,请查看 man page对于 strlen()

关于c - strlen() 如何计算当前函数中未定义的字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31429332/

相关文章:

c - 如何在 MSVC++6 中声明 'ilogbf' 等 IEEE 数学函数?

c - 使用互斥锁和 pthread 同步屏幕输出

javascript - 如何替换 {0} 而不是 {{0}}?

c - 在 C 中一起使用 strlen 和断言

PHP:strlen 返回字符长度而不是字节长度

c - 在链表结构体中传入字符串

c - 让程序在 C 中重复输入

java - 为什么 Java 不优化 String.split ("regex") 对字符串文字的调用?

r - 如何根据条件将向量元素与前一个元素粘贴在一起

c++ - 使用 strlen 时出错