给定 C 中的 printf 语句,我如何构造一个 char * 缓冲区,并知道它的长度?

Given a printf statement in C, how do I construct a char * buffer, and know its length?

我有一个需要打印到文件的 MPI 进程。 MPI 系统使用像 MPI_File_iwrite 这样的功能命令,它接受一个缓冲区(例如一个字符指针)和一个整数长度。然后,缓冲区被打印到文件中。

因此,为了打印我需要打印到文件中的内容,我需要以某种方式将 printf 函数替换为将格式转换映射到 char * 缓冲区的函数。这是有问题的,因为字符串的长度可能不同......例如:

printf("something %d, %d, %d, %f, etc.",x,y,z,p,d,...);

如何恢复 printf 格式生成的字符串,找出长度,并将其作为 char * 传递给 mpi 函数?

您似乎想使用 snprintf 足够大的缓冲区。

如果缓冲区足够大,snprintf 的 return 值等于打印的字符数。您可以将输出字符串的长度计算为缓冲区大小和 snprintf.

的 return 值中的最小值

根据你的问题,我认为答案是使用 sprintf()snprintf() 而不是 printf() - sprintf() 输出到缓冲区和 returns 不检查传递的缓冲区是否足够大而写入的字符数。 snprintf() 需要一个额外的参数来指定要写入的最大字节数(这是更安全的方法)。

char my_buf[MAX_LENGTH];
int bytes_written;

// using snprintf
bytes_written = snprintf(my_buf, MAX_LENGTH, "%d %d ...", arg0, arg1 ...);

请注意,sprintf() 和变体还需要一个额外的字节作为终止符 [=17=],因此这应该反映在您定义的缓冲区大小中。 return 值(写入的字节数)不包括终止符。

您可以 "print" 0 个字节到 NULL 指针 snprintf()。在这种情况下,不会写入任何字符串,但 snprintf() 的 return 值仍将正常运行。然后你可以分配一个足够大的缓冲区。

例如:

size_t len;
len = snprintf(NULL, 0, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...);
if (len > 0) {
    char *buf = malloc(len + 1);
    snprintf(buf, len + 1, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...);
}

这仅在 C99 及更高版本中有效。

请注意,如果存在转换错误,snprintf() 可以 return 为负值。只有少数情况会发生这种情况,但它们仍然存在。根据说明符,其输出也可能为零。