在C语言中将任何变量转换为字符串

3

任何类型的变量都可以转换为字符串吗?

我写了以下代码:

#define TO_STRING(val) #val

这是将变量转换为字符串的有效方法吗?


3
没问题,我来翻译:好的,我说这话可能有些挑剔,但事实是,在 C 语言中没有字符串。 - user2485710
4
这是一个相当奇怪的声明。 - unwind
3个回答

3
您将获得变量的字符串版本名称,即它将把a转换为"a"。当像这样使用#时,称为字符串化运算符

例如:

#define TO_STRING(val) #val

int main(void)
{
  const int a = 12;
  print("a is %s\n", TO_STRING(a));
  return 0;
}

这会打印出a is a

你期望会发生什么?

当预处理器运行时(也就是编译时),变量的值不可用,因此你当然无法获取变量的值。


3

我认为下面的代码可以完成你的工作。它使用了标准的sprintf函数,该函数可以将任何类型的数据输出到字符串中,而不是输出到stdout。代码如下:

#include <stdio.h>

#define INT_FORMAT "%d"
#define FLOAT_FORMAT "%f"
#define DOUBLE_FORMAT "%lf"
#define LL_FORMAT "%lld"
// ect ...

#define CONVERT_TO_STRING(FORMAT, VARIABLE, LOCATION) \
  do { \
    sprintf(LOCATION, FORMAT, VARIABLE); \
  } while(false)

int main() {
  char from_int[30];
  char from_float[30];
  char from_double[30];
  char from_ll[30];

  CONVERT_TO_STRING(INT_FORMAT, 34, from_int);
  CONVERT_TO_STRING(FLOAT_FORMAT, 34.234, from_float);
  CONVERT_TO_STRING(DOUBLE_FORMAT, 3.14159265, from_double);
  CONVERT_TO_STRING(LL_FORMAT, 9093042143018LL, from_ll);

  puts(from_int);
  puts(from_float);
  puts(from_double);
  puts(from_ll);

  return 0;
}

我无法理解为什么要这样写?do {
sprintf(LOCATION, FORMAT, VARIABLE);
} while(false)
- cosmos
1
@user2407394 只是为了安全起见 :) - Rontogiannis Aristofanis
建议使用%e而不是%f。比较以下两个输出结果:printf("%e %f\n", 1.23e-8, 1.23e-8); printf("%e %f\n", 1.23e+50, 1.23e+50); 第一个输出结果为 1.230000e-08 0.000000,第二个输出结果为 1.230000e+50 22999999999999994846185700645503654167417200000000.000000 - chux - Reinstate Monica
我能否在不知道变量类型的情况下打印变量的值?就像一个通用的占位符或一种通用的打印方式? - hakuna matata

3

尝试这个代码,它适用于整数:编辑格式字符串以适应其他数据类型。

sprintf(str,"%d",value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接