如何根据变量的类型选择fscanf格式?

Sie*_*yer 0 c

假设我正在实现一个矩阵,我想要我的结构使用scalar_t,哪里scalar_t可以floatdouble.

然后,假设我想扫描一些文本文件并将其加载到我的矩阵中:

// Inner loop:
fscanf(mdata, format, &m->data[i * m->cols + j]);
Run Code Online (Sandbox Code Playgroud)

如果scalar_t *float *,format应该是"%f".如果是的double *"%lf".

如何调整类型的格式scalar_t?我知道我可以比较sizeof但是有一般的解决方案吗?

小智 5

C99的设计师<inttypes.h>也有类似的问题.他们定义了类似int32_t某些特定属性的类型,并允许每个实现根据需要intlong必要时对其进行类型设置.但是printf和scanf格式变得特定于平台.

他们的解决办法是与每种类型,像沿着限定一组宏SCNd32这将是"d""ld"以匹配intlong针对的typedef.

用法看起来像

int32_t i;
scanf("%"SCNd32, &i);
Run Code Online (Sandbox Code Playgroud)

对于每种类型,对于您可能想要对该类型执行的每次转换都有一个单独的宏(不仅如此d,也x适用于十六进制等)

您可以为自定义类型执行相同的操作.在标题中:

#if something
typedef float scalar_t;
#define SCNfSCALAR "f"
#else
typedef double scalar_t;
#define SCNfSCALAR "lf"
#endif
Run Code Online (Sandbox Code Playgroud)

并在调用代码中:

scalar_t x;
scanf("%"SCNfSCALAR, &x);
Run Code Online (Sandbox Code Playgroud)