如标题所述,如何在给定未知格式字符串的情况下 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
,然后再次调用它来进行实际打印。
如果您更喜欢较少剪切和粘贴的版本,请参阅您需要的算法大纲:
- 找到
argc
- 标记
格式
。 (如果您正在编写生成格式的代码,您可以只提供一个标记列表而不是一个字符串) - 对于每个 token ,调用
snprintf(buf + upto, space_remaining, token, argv[i++]);
在执行此操作时,您需要跟踪您用完了多少 buf
(如果您要在每一步都重新分配
,使用双 snprintf
方法)。还要检查您是否在到达 argc
之前停下来。
关于c - 如何在给定未知格式字符串的情况下 sprintf 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452115/