创建一个"模板" (格式)字符串

时间:2014-09-14 08:28:42

标签: c string printf variadic-functions

我希望能够创建模板字符串,然后像这样使用它:

int execute_command(char *cmd) {
  //...
}

char *template_command = "some_command %s some_args %s %d";
char *actual_command = template_command % (cmd1, arg1, 123);
// error, how do I do that?
int res = execute_command(actual_command);

2 个答案:

答案 0 :(得分:1)

使用snprintfmallocsnprint返回它写入的字符串的长度,只有缓冲区足够大,并且接收缓冲区的大小)。 POSIX asnprintf很好地打包了 如果你没有它,请像这样定义你自己:

char* my_asnprintf(const char* format, ...) {
    va_list arg;
    va_start(arg, format);
    size_t n = 1 + vsnprintf((char*)format, 0, format, arg);
    va_end(arg);
    char* ret = malloc(n);
    if(!ret)
        return ret;
    va_start(arg, format);
    vsnprintf(ret, n, format, arg);
    va_end(arg);
    return ret;
}

不要忘记free缓冲区。

答案 1 :(得分:1)

如果您知道actual_command的最大长度,则可以使用以下任一项:

char actual_command[MAX_LEN+1];

// Option #1
sprintf(actual_command, template_command, cmd1, arg1, 123);

// Option #2
snprintf(actual_command, MAX_LEN+1, template_command, cmd1, arg1, 123);

如果未正确定义MAX_LEN,则:

  • 选项#1将导致未定义的行为(可能是运行时异常)
  • 选项#2将导致错误的结果(actual_command的内容)