如何多次打印一个字符串只引用它一次?
How to print a string multiple times referencing it only once?
此代码:
#include <stdio.h>
void main()
{
char *csv_delimiter = ",";
printf("col1%scol2%scol3%scol4\n", csv_delimiter, csv_delimiter, csv_delimiter);
}
有这个输出:
col1,col2,col3,col4
这正是我所需要的。但是我必须多次引用指针 csv_delimiter
。如果我有 1000 列怎么办?有没有办法只引用一次 csv_delimiter
并多次打印以分隔尽可能多的列?我正在寻找这样的代码:
#include <stdio.h>
void main()
{
char *csv_delimiter = ",";
printf("col1[REF1]col2[REF1]col3[REF1]col4\n", csv_delimiter);
}
从这个例子可以看出,我不是在寻找循环(由于与实现相关的原因,我无法在原始代码中循环)。我需要一些方法将很多 %s
放在一行中并将它们全部指向同一个指针,在本例中为 csv_delimiter
。我相信这是可能的。我记得在 Deitel 上读过类似的东西,但我找不到他在哪里解释如何做到这一点。
为什么不能使用循环?
int i, max;
for(i=0; i<max-1; i++){
printf("col%d%s ", i, csv_delimiter);
}
printf("col%d%\n", max);
其中 max 是您要打印的最高值。
您可以使用格式说明符位置修饰符:
void main()
{
char *csv_delimiter = ",";
printf("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
}
这里的 %1$s 是格式后第一个参数的格式说明符。
在Windows上有一个_printf_p()函数,它实现了位置参数。
所以改为
printf("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
你应该可以使用
_printf_p("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/bt7tawza.aspx。
编辑:
对于 Linux/Windows 交叉编译使用这样的东西:
#if defined (__WIN32__)
_printf_p(...);
#elif defined (__linux__)
printf(...);
#endif
OP 断言 "I can't loop in the original code due to reasons related to the implementation)".
假设此限制不涉及所有代码,而仅涉及打印命令本身,请调用辅助函数而不是 printf()
。由于 OP 想要“...某种方式将大量 %s 放在一行中并将它们全部引用到同一个指针”,因此处理该行很容易。
#include <stdio.h>
void printf_renatov(const char *format, const char *csv_delimiter) {
while (*format) {
if (format[0] == '%' && format[1] == 's') {
fputs(csv_delimiter, stdout);
format += 2;
} else {
fputc(*format, stdout);
format++;
}
}
}
int main(void) {
char *csv_delimiter = ",";
printf_renatov("col1%scol2%scol3%scol4\n", csv_delimiter);
}
col1,col2,col3,col4
此代码:
#include <stdio.h>
void main()
{
char *csv_delimiter = ",";
printf("col1%scol2%scol3%scol4\n", csv_delimiter, csv_delimiter, csv_delimiter);
}
有这个输出:
col1,col2,col3,col4
这正是我所需要的。但是我必须多次引用指针 csv_delimiter
。如果我有 1000 列怎么办?有没有办法只引用一次 csv_delimiter
并多次打印以分隔尽可能多的列?我正在寻找这样的代码:
#include <stdio.h>
void main()
{
char *csv_delimiter = ",";
printf("col1[REF1]col2[REF1]col3[REF1]col4\n", csv_delimiter);
}
从这个例子可以看出,我不是在寻找循环(由于与实现相关的原因,我无法在原始代码中循环)。我需要一些方法将很多 %s
放在一行中并将它们全部指向同一个指针,在本例中为 csv_delimiter
。我相信这是可能的。我记得在 Deitel 上读过类似的东西,但我找不到他在哪里解释如何做到这一点。
为什么不能使用循环?
int i, max;
for(i=0; i<max-1; i++){
printf("col%d%s ", i, csv_delimiter);
}
printf("col%d%\n", max);
其中 max 是您要打印的最高值。
您可以使用格式说明符位置修饰符:
void main()
{
char *csv_delimiter = ",";
printf("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
}
这里的 %1$s 是格式后第一个参数的格式说明符。
在Windows上有一个_printf_p()函数,它实现了位置参数。 所以改为
printf("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
你应该可以使用
_printf_p("col1%1$scol2%1$scol3%1$scol4\n", csv_delimiter);
有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/bt7tawza.aspx。
编辑:
对于 Linux/Windows 交叉编译使用这样的东西:
#if defined (__WIN32__)
_printf_p(...);
#elif defined (__linux__)
printf(...);
#endif
OP 断言 "I can't loop in the original code due to reasons related to the implementation)".
假设此限制不涉及所有代码,而仅涉及打印命令本身,请调用辅助函数而不是 printf()
。由于 OP 想要“...某种方式将大量 %s 放在一行中并将它们全部引用到同一个指针”,因此处理该行很容易。
#include <stdio.h>
void printf_renatov(const char *format, const char *csv_delimiter) {
while (*format) {
if (format[0] == '%' && format[1] == 's') {
fputs(csv_delimiter, stdout);
format += 2;
} else {
fputc(*format, stdout);
format++;
}
}
}
int main(void) {
char *csv_delimiter = ",";
printf_renatov("col1%scol2%scol3%scol4\n", csv_delimiter);
}
col1,col2,col3,col4