【问题标题】:Issue with Strlen() functionality in CC 中 Strlen() 功能的问题
【发布时间】:2016-01-24 11:20:33
【问题描述】:
#include <stdio.h>
int main()
{
char arr[]= {'g', 'e', 'e', 'k', 's'}; 
printf("%d %d", sizeof(arr),strlen(arr));
return 0;
}

我得到的输出是 5 6 ,我无法理解为什么我得到 6 而不是 5 因为字符数组长度是 5?

【问题讨论】:

  • 1.那不是字符串。 2. 你没有使用strlen(这很好,因为...1)。
  • “我得到的输出是 5 6” 不,你不是。你得到的输出为 5。也就是说,%dsizeof 结果的错误格式说明符,所以我想它可能是 UD。 (还要注意sizeof 不是函数,不需要()。)
  • 您应该使用%zu,因为它是size_t 的正确格式说明符。
  • @CoolGuy: 或者使用%d 并转换为int: printf("%d\n", (int)sizeof arr); 但是是的,%zu 更好(除非你被一个不支持它的古老实现所困扰)。
  • @T.J.Crowder:UD 是什么意思?你的意思是UB

标签: c arrays string sizeof


【解决方案1】:

'\0' 结尾的char 数组也被视为字符串;因此注意arr的数组大小是5,而str的数组大小是6,但是strstrlen)的字符串大小是5

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

int main()
{
  char arr[]= {'g', 'e', 'e', 'k', 's'};
  char str[]= {'g', 'e', 'e', 'k', 's', '\0'};

  printf("sizeof arr %d \n", sizeof(arr));
  printf("sizeof str %d \n", sizeof(str));
  printf("strlen str %d \n", strlen(str));

  return 0;
}

即,

sizeof arr 5 
sizeof str 6 
strlen str 5 

【讨论】:

    【解决方案2】:

    根据 C 标准(7.1.1 术语定义)

    1 字符串是由and终止的连续字符序列 包括第一个空字符。

    ...字符串的长度是null之前的字节数 人物

    函数strlen(7.23.6.3 strlen 函数)计算字符数组中空字符之前的字符数:

    2 strlen 函数计算指向的字符串的长度 秒。

    至于sizeof运算符则(6.5.3.4 sizeof和alignof运算符)

    2 sizeof 运算符产生其操作数的大小(以字节为单位),即 可以是表达式或类型的括号名称。尺寸是 由操作数的类型决定。

    这个声明声明了一个字符数组,其大小由初始化器的数量决定

    char arr[]= {'g', 'e', 'e', 'k', 's'}; 
    

    根据 C 标准(6.7.9 初始化)

    22 如果一个未知大小的数组被初始化,它的大小是确定的 通过具有显式初始化程序的最大索引元素。

    所以数组正好有 5 个元素。根据sizeof运算符表达式的定义,其类型为char[5]abd

    sizeof(arr),
    

    产生其操作数 arr 的大小(以字节为单位),即 5。

    数组不包含空字符。因此函数strlen 无法计算空字符之前的字节数。在这种情况下,它的行为是未定义的。它将计算数组之外的所有字节,直到遇到空字符。因而表达

    strlen(arr)
    

    可以产生任何大于 5 的结果。

    您可以使用字符串文字初始化数组,例如

    char arr[]= {"geeks"}; 
    

    在这种情况下,数组也由字符串文字的空字符初始化。这个初始化等价于

    char arr[]= {'g', 'e', 'e', 'k', 's', '\0'};
    

    这里是数组的大小

    sizeof(arr),
    

    等于6。由于数组有空字符表达式

    strlen(arr)
    

    将准确计算空字符之前的 5 个字符。

    【讨论】:

      【解决方案3】:

      当你写char arr[] = {'g', 'e', 'e', 'k', 's'}; 时你有一个字符数组,所以sizeof(arr) 给你以字节为单位的arr 长度,即5。但是当你写char arr[] = "geeks"; 时,你会自动得到一个'\0' 字符在 arr 的末尾,所以 arr 的大小是 6 个字节。

      【讨论】:

        【解决方案4】:

        要获得string 的大小,应使用strlen()

        strlen() 需要一个 \0 终止字符串

        【讨论】:

        • 所以在这种情况下没有 '\0' 那么会发生什么,编译器会继续搜索 '\0' ,所以你能清楚地解释 strlen() 在这种情况下的行为吗情况。
        • @user3290550:编译器不会做任何事情。它生成的代码将开始搜索您的char[] 数组并继续,直到 A)您得到一个用于访问您不应该访问的内存的段错误,或 B)它找到一个 \0strlen 的行为与未明确以空值终止的内存块的行为是未定义的。但是,你知道,它不会有用。 :-)
        • 为什么只有6个,也可以是7个,能不能再看一遍代码
        • @user3290550 带有未明确以空值终止的内存块的 strlen 的行为是未定义的。 这意味着它可以是任何东西,67halo.
        • [叹气] '你能清楚地解释 strlen() 在这种情况下的行为吗' - 作业告诉。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        相关资源
        最近更新 更多