c - 如何为没有空字符的字符串计算 strlen?

标签 c string c-strings string-length strlen

此代码返回 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;
}

最佳答案

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

如果你想知道这到底是怎么发生的,这很可能是因为 strlen一直试图找到空终止符,偶尔会在 arr 之后的某个地方找到它。 .

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

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

关于c - 如何为没有空字符的字符串计算 strlen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38499311/

相关文章:

c - C中动态分配的字符串数组

c - 使用取模运算符获取特定范围内的随机变量

c - 数组索引和计数器溢出

arrays - Lua - 检查数组是否存在

c - 如何在没有相同引用的情况下将文本文件中的字符串存储在 C 中?

c - strncpy() 在第二次调用同一源时失败

c - 如何将开关箱内的箱子软分隔

java - Java 处理输入时出现问题

c++ - 使用 C 样式字符串文字与构造未命名的 std::string 对象的默认建议?

c - &"string"与 "string"是同一地址吗?