【问题标题】:sizeof doesn't give back the real length of an input [duplicate]sizeof 不返回输入的实际长度[重复]
【发布时间】:2021-11-16 15:20:20
【问题描述】:

我尝试在我的程序中测试 sizeof 但它不起作用。

char toFind[100];
fgets(toFind, sizeof(toFind), stdin);
printf(" %i", sizeof(toFind));

我输入的内容打印出 100。 我做错了什么。

【问题讨论】:

  • sizeof 在编译时进行评估。您是否对strlen 感兴趣?
  • 唯一你做错的就是使用"%i" 打印sizeof, use "%zu" instead。你对sizeof的期望是错误的,它确实应该打印出100,这就是toFind的大小。
  • 如果您确实使用了strlen,您可能会注意到大小比您预期的多一倍。那是因为fgets 包含换行符(如果存在)。

标签: arrays c c-strings sizeof strlen


【解决方案1】:

toFind 是一个 100 个字符的数组。每个字符为 1 个字节。所以toFind 是 100 个字节。

因此sizeof(toFind),告诉你toFind有多少字节,是100。没有问题。 sizeof 工作正常。

您可能对strlen(toFind) 感兴趣,它告诉您在第一个 0 字节之前还有多少字节。由于fgets 在它读取的字符之后放置了一个 0 字节,这告诉您fgets 读取了多少个字符。

【讨论】:

    【解决方案2】:

    sizeof 返回变量的大小。它与它包含的内容无关。事实上,它是在编译时计算出来的。

    fgets 使用以 NUL 结尾的字符串填充变量。因此,您可以使用strlen 来查找其长度。请注意,由于这是了解fgets 读入多少的唯一方法,因此它不适用于可能包含 NUL 字符的数据。

    顺便说一下,size_tsizeof 返回的类型)的正确格式说明符是%zu

    【讨论】:

      【解决方案3】:

      对于初学者,您必须使用转换说明符%zu 来输出size_t 类型的值(运算符sizeof 返回类型为size_t 的值)而不是转换说明符%i

      printf(" %zu", sizeof(toFind));
      

      运算符sizeof返回声明为的数组toFind的大小

      char toFind[100];
      

      数组的大小不依赖于数组中存储的内容。

      相反,您需要使用在标头<string.h> 中声明的函数strlen 就像

      #include <string.h>
      #include <stdio.h>
      
      //...
      
      
      printf( "%zu\n", strlen( toFind ) );
      

      但在使用该函数之前,您应该删除可以通过函数fgets 附加到输入字符串的换行符'\n'

      #include <string.h>
      #include <stdio.h>
      
      //...
      
      
      toFind[ strcspn( toFind, "\n" ) ] = '\0';
      printf( "%zu\n", strlen( toFind ) );
      

      【讨论】:

        猜你喜欢
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2018-09-20
        • 2021-10-08
        • 2021-07-30
        • 1970-01-01
        相关资源
        最近更新 更多