给定 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 为负值。只有少数情况会发生这种情况,但它们仍然存在。根据说明符,其输出也可能为零。
我有一个需要打印到文件的 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
.
根据你的问题,我认为答案是使用 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 为负值。只有少数情况会发生这种情况,但它们仍然存在。根据说明符,其输出也可能为零。