c - 如何在给定未知格式字符串的情况下 sprintf 数组?

标签 c

如标题所述,如何在给定未知格式字符串的情况下 sprintf 数组? IE。如何填写my_sprintf

char* my_sprintf(const char *format, char **args){
    char *result = malloc(MAX_SIZE_STRING*sizeof(char));
    // ???
    return result;
}

int main(int argc, char *argv[]){
    printf("%s\n", my_sprintf("%s %s %s", argv));
    return 0;
}

最佳答案

(此答案考虑了 OP 的评论“我只打算将 %s 与修饰符等一起使用”)

请注意,可能 构建您自己的 va_list,但是其细节是特定于实现的并且极其不可移植,所以我不打算走那条路。

这可以说是最简单的方法:

if ( argc == 1 ) snprintf(buf, sizeof buf, format, argv[0]);
else if ( argc == 2 ) snprintf(buf, sizeof buf, format, argv[0], argv[1]);
else if ( argc == 3 ) snprintf(buf, sizeof buf, format, argv[0], argv[1], argv[2]);
// ...etc, so far as you want

您通过遍历 argv 直到找到 NULL 来计算 argc(保证 argv[argc]NULL)。

此代码使用固定缓冲区大小char buf[MAX_LENGTH];,然后您可以strdup 来创建您的返回值或其他任何内容。如果你想避免 MAX_LENGTH 限制,那么你必须为每种情况调用 snprintf 两次:一次找出所需的长度;然后是 malloc,然后再次调用它来进行实际打印。

如果您更喜欢较少剪切和粘贴的版本,请参阅您需要的算法大纲:

  1. 找到argc
  2. 标记格式。 (如果您正在编写生成格式的代码,您可以只提供一个标记列表而不是一个字符串)
  3. 对于每个 token ,调用 snprintf(buf + upto, space_remaining, token, argv[i++]);

在执行此操作时,您需要跟踪您用完了多少 buf(如果您要在每一步都重新分配,使用双 snprintf 方法)。还要检查您是否在到达 argc 之前停下来。

关于c - 如何在给定未知格式字符串的情况下 sprintf 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452115/

相关文章:

c - Fortran 数组到 C 数组。需要愚蠢的宏技巧

C编程: What conditions do I put for an if statements for numbers 1 to 35 inclusive?

c - fread 成多个变量

c - Prime Sieve 无输出

c++ - 为什么在 C/C++ 中重复包含一些头文件?

c - 如何在 C 中设置/翻转位域

c - 将新节点添加到我的链表堆栈中会将所有旧节点更新为新节点

c - 如何在我的 C 程序中定义起始索引?

c - 释放C中结构的内存

c - 如何在 C 中存储我的 map ?