【问题标题】:How is the strlen calculated for a string without null character?如何为没有空字符的字符串计算 strlen?
【发布时间】:2016-07-21 08:45:35
【问题描述】:

此代码返回 n=11,第 10 和第 11 个字符分别为 ' ' 和 '@' 这是如何运作的? strlen 函数如何将其视为 11 个字符?在某些编译器中,字符串长度似乎为 12 个字符。

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

void fun(char *arr)
{
   int i;
   unsigned int n = strlen(arr);
   printf("n = %d\n", n);
   for (i=0; i<n; i++)
     printf("%c  ", arr[i]);
}

int main()
{
   char arr[] = {'g', 'e', 'e', 'k', 's', 'q', 'u', 'i', 'z'};
   fun(arr);
   return 0;
}

【问题讨论】:

  • 未定义的行为 - 这里可能发生任何事情,包括段错误或未终止。
  • 你碰巧在“geeksquiz”常量结束后的某个地方有一个 nul 字符。考虑到您将在只读数据段中拥有的其他值(没有想到),它可能有一些逻辑,但这绝对不是您应该依赖的东西。
  • "没有空字符的字符串" 不是字符串

标签: c string c-strings string-length strlen


【解决方案1】:

根据标准,由于您的“字符串”没有空终止符,因此这不是字符串。使用字符串以外的任何内容调用 strlen 是未定义的行为,因此任何事情都可能发生,包括您正在观察的情况。

如果您想知道这到底是怎么发生的,这可能是因为strlen 一直在尝试查找空终止符,并且偶尔会在内存中arr 之后的某个位置找到它。

请注意,如果找不到“足够快”的空终止符,此代码甚至可能出现段错误。

您可以使用valgrind 之类的工具来检测此类内存访问违规。

【讨论】:

    【解决方案2】:

    C 中,“字符串”的末尾有一个NUL 字符。没有NULchar[] 只是char[] 而不是“字符串”。

    C 中的数组不会在任何地方存储它们的长度,因此只要没有找到 NULstrlen() 就会一直存在。您可能很幸运在数组结束后拥有NUL 正确的几个内存单元。

    【讨论】:

    • NULNULL 不一样。 NUL'\0'0 和“空字符”是一样的。
    【解决方案3】:

    每当您初始化字符串时,编译器都会自动为您添加nul 运算符\0。例如,就像您在代码中尝试做的只是制作 char 数组,而不是这样做,您可以使用 " " 并且当您要求输入字符串时,编译器会自动为您添加 \0来自用户。但是当然有些情况下您需要自己添加 nul 运算符,例如,当您尝试逐字分解字符串并尝试将它们保存在指针数组中时,语法:char *str[20] 那么您有最后添加\0。如果你对strlen() 函数不满意,你可以像这样编写自己的代码:

    size_t count = 0;
    while (str != '\0'){     //str is the string name
    count++;
    }
    

    谢谢!

    【讨论】:

    • C 中没有“nul 运算符”这样的东西。你可能指的是0-终止符,又名空终止符,又名NUL -终结者。
    • 我建议你重新打开和修改书。 NULL 用于指针,由编译器分配给全局指针的值,对于本地指针,您需要为自己分配,还有 nul 终止符,它是字符串的一部分,如果您打开书并阅读字符串,然后你就会知道这个术语和签名\0 叫什么。谢谢你,是的,0 是数字,它不是任何终结符。 @alk
    • NUL 是值'\0' 等于值0 的字符的名称。它用于终止 C-“字符串”。这些与空指针值NULL无关,至少在C 中没有。注意各种L/ls 的不同数字和大小写。我在这里推荐 C 标准:port70.net/~nsz/c/c11/n1570.html
    • 谢谢,我想我是需要阅读更多内容的人,谢谢@alk的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多