我需要将一个整数连接到系统调用字符串:
status = system("./run test.txt " + integer);
这里的integer
可以是任何整数。
最好的方法是什么?
使用 snprintf
(如果您没有snprintf
或需要您的代码在没有它的系统上运行,则使用 sprintf
(打印到 char 缓冲区,并将其传递给system
调用。
例如
#define MAX_LEN 128
char buffer[MAX_LEN];
int val = 0;
snprintf(buffer, MAX_LEN, "./run test.txt %d", val);
// you would be wise to check that snprintf has not truncated your command
// before passing it to system()
status = system(buffer);
或者,您可以计算整数需要多少个字符,然后分配大小完全正确的缓冲区。这将允许您安全地使用sprintf
,并且无需检查截断 - chux 的答案证明了这一点。请注意,如果您不能使用 VLA (C89( 并且有理由避免malloc()
,例如在某些嵌入式系统上,这可能不是一个好的策略。
接受答案后
通过 VLA 或 malloc()
使用大小合适的缓冲区。 估计固定缓冲区大小可能会使缓冲区溢出sprintf()
或使用 snprintf()
创建截断的结果。
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int system_command_int(const char *command, int i) {
#define INT_PRINT_SIZE(i) ((sizeof(i) * CHAR_BIT)/3 + 3)
char buf[strlen(command) + 1 + INT_PRINT_SIZE(i) + 1];
sprintf(buf, "%s %d",command, i);
return system(buf);
}
int status = system_command_int("./run test.txt", integer);
INT_PRINT_SIZE(i)
宏返回容纳整数类型 i
的十进制表示形式所需的char
大小。 对于某些整数类型,结果可能会额外增加 1 或 2,但永远不会太小。 或者,代码可以使用额外开销较少的10*sizeof(type)*CHAR_BIT/33 + 3
。 这个想法是将位宽乘以接近和>= log10(2( 或 ~0.30103 的某个整数 a/b 分数。 此大小确实包括尾随' '
的char
需求。 所以上面的char buf[]
不需要尾随+ 1
.
使用 sprintf:
char buffer[256];
sprintf(buffer,"./run test.txt %d",integer);
status = system(buffer);
see man sprintf
char buf[150];
sprintf(buf, "./run test.txt %d", integer);
status = system(buf);
确保 buf 不会太小。
#define COMMAND_SIZE 100
char command[COMMAND_SIZE];
sprintf(command, "./run test.txt %d", integer);
status = system(command);