格式字符串末尾带有 %s 的 snprintf 行为
Behaviour of snprintf with %s at end of format string
我正在用 snprintf()
构建我想用 system()
执行的命令。我注意到当我在格式字符串末尾使用 %s
时缺少最后一个字符,但是当我在 %s
之后添加额外的 space 时,它按我预期的方式工作。为什么会这样?我想我错过了什么。感谢您的帮助!
这是一个最小的例子:
#define INTERFACE "can0"
int size;
char *command = NULL;
size = snprintf(command, 0, "/sbin/ifdown %s", INTERFACE);
command = malloc(size);
snprintf(command, size, "/sbin/ifdown %s", INTERFACE);
snprintf
returns 打印的字符数 不包括空终止符 。因此,当您将该大小传回 snprintf
时,它会发现您的缓冲区少了一个字符。修复如下:
size = snprintf(command, 0, "/sbin/ifdown %s", INTERFACE);
command = malloc(size+1);
snprintf(command, size+1, "/sbin/ifdown %s", INTERFACE);
en.cppreference 说(强调是我的)
int snprintf( char *restrict buffer, size_t bufsz, const char *restrict format, ... ); (4)
- Writes the results to a character string buffer. At most bufsz - 1 characters are written. The resulting character string will be terminated with a null character, unless bufsz is zero. If bufsz is zero, nothing is written and buffer may be a null pointer, however the return value (number of bytes that would be written not including the null terminator) is still calculated and returned.
因此您的第一个调用 returns 将写入的字符数不包括终止空字符。您对 snprintf
的第二次调用表示应写入 size
个字符,包括终止空字符。
因此解决方法应该是分配更大的缓冲区并在第二次调用中传递 size+1
。
command = malloc(size+1);
snprintf(command, size+1, "/sbin/ifdown %s", INTERFACE);
您没有显示带有额外 space 的代码。但我猜你已经将它添加到 snprintf
的第一次调用中,也许还添加到了第二次调用中。在这种情况下,您的第一个 snprintf
returns 一个 size
更高。第二个 snprintf
不能写额外的 space,但是有了更高的 size
它现在可以写出你期望的字符串。
我正在用 snprintf()
构建我想用 system()
执行的命令。我注意到当我在格式字符串末尾使用 %s
时缺少最后一个字符,但是当我在 %s
之后添加额外的 space 时,它按我预期的方式工作。为什么会这样?我想我错过了什么。感谢您的帮助!
这是一个最小的例子:
#define INTERFACE "can0"
int size;
char *command = NULL;
size = snprintf(command, 0, "/sbin/ifdown %s", INTERFACE);
command = malloc(size);
snprintf(command, size, "/sbin/ifdown %s", INTERFACE);
snprintf
returns 打印的字符数 不包括空终止符 。因此,当您将该大小传回 snprintf
时,它会发现您的缓冲区少了一个字符。修复如下:
size = snprintf(command, 0, "/sbin/ifdown %s", INTERFACE);
command = malloc(size+1);
snprintf(command, size+1, "/sbin/ifdown %s", INTERFACE);
en.cppreference 说(强调是我的)
int snprintf( char *restrict buffer, size_t bufsz, const char *restrict format, ... ); (4)
- Writes the results to a character string buffer. At most bufsz - 1 characters are written. The resulting character string will be terminated with a null character, unless bufsz is zero. If bufsz is zero, nothing is written and buffer may be a null pointer, however the return value (number of bytes that would be written not including the null terminator) is still calculated and returned.
因此您的第一个调用 returns 将写入的字符数不包括终止空字符。您对 snprintf
的第二次调用表示应写入 size
个字符,包括终止空字符。
因此解决方法应该是分配更大的缓冲区并在第二次调用中传递 size+1
。
command = malloc(size+1);
snprintf(command, size+1, "/sbin/ifdown %s", INTERFACE);
您没有显示带有额外 space 的代码。但我猜你已经将它添加到 snprintf
的第一次调用中,也许还添加到了第二次调用中。在这种情况下,您的第一个 snprintf
returns 一个 size
更高。第二个 snprintf
不能写额外的 space,但是有了更高的 size
它现在可以写出你期望的字符串。