c 将可变长度 int 连接到字符串而不打印它



我需要将一个整数连接到系统调用字符串:

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);

最新更新