如何多次打印一个字符串只引用它一次?

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