在 C 中重用格式说明符
Reuse a format specifier in C
有没有办法在 C 中重用格式说明符?我想对接下来的 20 个输出使用相同的说明符,有没有比写说明符 20 次更简单的方法? v
在 Fortran 中,我可以通过在说明符前面写上 20 来做到这一点,因此 (20F10.0) 与 (F10.0 F10.0 F10.0...) 相同。 C中有类似的东西吗?
冒着你的预处理器宏看起来像一条口吃严重的蛇的风险,并且你未来的自己想知道为什么你做了这样的事情,你可以(ab)使用字符串常量可以连接的事实...
#include <stdio.h>
#define REPEAT5(s) s s s s s
#define REPEAT4(s) s s s s
#define REPEAT20(s) REPEAT4(REPEAT5(s))
int main() {
printf(REPEAT20("%d "), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
}
如果您 运行 这个 on Godbolt.org 您可以看到格式字符串已正确扩展为
.asciz "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
这应该可以解决问题:
char *n_format(char *format, size_t n, char delimiter)
{
char *result;
int index = 0;
size_t len;
if (!format)
return (NULL);
len = strlen(format);
if (!(result = malloc(len * n + n)))
return (NULL);
for (int i = 0; i < n; ++i)
{
strcpy(result + index, format);
index += len;
result[index++] = delimiter;
}
result[index - 1] = '[=10=]';
return (result);
}
用法:
int main()
{
char *string;
string = n_format("%.5f", 5, ' ');
printf("|%s|\n", string);
// output: |%.5f %.5f %.5f %.5f %.5f|
free(string);
return (0);
}
int x;
for(x=0;x<20;x++)
printf("%d", x);
It's just a diagram. In the
body of the for loop, you
can independently determine
what exactly printf ( )will print.
有没有办法在 C 中重用格式说明符?我想对接下来的 20 个输出使用相同的说明符,有没有比写说明符 20 次更简单的方法? v
在 Fortran 中,我可以通过在说明符前面写上 20 来做到这一点,因此 (20F10.0) 与 (F10.0 F10.0 F10.0...) 相同。 C中有类似的东西吗?
冒着你的预处理器宏看起来像一条口吃严重的蛇的风险,并且你未来的自己想知道为什么你做了这样的事情,你可以(ab)使用字符串常量可以连接的事实...
#include <stdio.h>
#define REPEAT5(s) s s s s s
#define REPEAT4(s) s s s s
#define REPEAT20(s) REPEAT4(REPEAT5(s))
int main() {
printf(REPEAT20("%d "), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
}
如果您 运行 这个 on Godbolt.org 您可以看到格式字符串已正确扩展为
.asciz "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
这应该可以解决问题:
char *n_format(char *format, size_t n, char delimiter)
{
char *result;
int index = 0;
size_t len;
if (!format)
return (NULL);
len = strlen(format);
if (!(result = malloc(len * n + n)))
return (NULL);
for (int i = 0; i < n; ++i)
{
strcpy(result + index, format);
index += len;
result[index++] = delimiter;
}
result[index - 1] = '[=10=]';
return (result);
}
用法:
int main()
{
char *string;
string = n_format("%.5f", 5, ' ');
printf("|%s|\n", string);
// output: |%.5f %.5f %.5f %.5f %.5f|
free(string);
return (0);
}
int x;
for(x=0;x<20;x++)
printf("%d", x);
It's just a diagram. In the
body of the for loop, you
can independently determine
what exactly printf ( )will print.