任何类型的变量都可以转换为字符串吗?
我写了以下代码:
#define TO_STRING(val) #val
这是将变量转换为字符串的有效方法吗?
任何类型的变量都可以转换为字符串吗?
我写了以下代码:
#define TO_STRING(val) #val
这是将变量转换为字符串的有效方法吗?
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
。
你期望会发生什么?
当预处理器运行时(也就是编译时),变量的值不可用,因此你当然无法获取变量的值。
我认为下面的代码可以完成你的工作。它使用了标准的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;
}
%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尝试这个代码,它适用于整数:编辑格式字符串以适应其他数据类型。
sprintf(str,"%d",value);