【问题标题】:One liner to find length of a variable查找变量长度的一条线
【发布时间】:2011-10-21 10:11:06
【问题描述】:

我刚刚偶然发现,既然 printf 返回它已打印到输出流的字符数,为什么不使用它来查找 c 中任何变量的长度?

代码是这样的,

#include<stdio.h>
int main()
{
 char *a="Length";
 int i=1000;
 printf("Size: %d\n",printf("%d\n",i)-1);
 printf("String Size: %d",printf("%s\n",a)-1);
 return 1;
}

我说的对吗?我不关心它在哪里被使用。只是想知道我的理解是否正确。

【问题讨论】:

  • 它有效,但效率低下,并且会在标准输出上产生虚假输出。
  • 返回变量值的打印表示的长度。 printf 也有一个副作用:它打印东西 :) 所以它不如没有副作用来计算长度的函数那么干净。
  • @LudovicKuty:同意。但是可以说我有一个函数可以打印它需要找到长度的变量。我打印了我在上面的 sn-p 中所做的变量及其长度。那么在这种情况下,编写干净的代码仍然存在问题吗?
  • @PaulR:为什么输出必须是虚假的?可以举个例子吗?
  • @Ajai:您会得到虚假输出,因为 printf 有副作用,即它会在标准输出上生成输出 - 所以对于您要评估的每个变量,您将在标准输出上 printfing 该变量。

标签: c printf


【解决方案1】:

“任何变量的长度”是什么意思?您是指用于存储变量的字节数(使用sizeofstrlen 函数更好地实现)或变量的字符串表示的字节长度?

对于后一种,您应该小心,因为您可以使用格式选项来实际修改结果。考虑以下示例:

float num = 10.0f;
printf("%.10f", num); // return value should be 13
printf("%f", num);    // return value depends on the implementation of printf and the float value supplied

您还必须考虑除十进制之外还有其他表示形式。

正如其他人已经说过的那样,printf 具有实际写入stdout 的副作用。如果您不想这样,您可以使用snprintf 写入缓冲区而不是stdout

char buffer[256];
int x = 10;
snprintf(buffer, sizeof(buffer), "%d", x); // return value is '2'

【讨论】:

    【解决方案2】:

    "查找变量长度的一条线"

    不可能,除非它内置在您的编译器中,或者您定义一个半页长的狂野和毛茸茸的宏,并带有几个 enums 来声明您的类型...

    对于字符串,(您不能在...上使用 sizeof)请参阅:https://stackoverflow.com/a/22128415/3370790

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多