我有一些字符串foo
,我希望能够运行as foo.s -o foo.o
之类的字符串。如果是printf
,我可以printf("as %s.s -o %s.o", foo, foo);
。除了使用system
函数之外,我希望能够做的就是这样。我怎样才能做到这一点?使用与printf
相同的方法给出了一个错误,说我已经传递了太多的论据。
在我的代码中,我有:
for (int i = 1; i < argc; i++) {
system("as %s.s -o %s.o", *(argv + i), *(argv + i));
}
但这给了我一个错误,说我有太多的论点。我想我可以经历循环遍历字符数组的痛苦过程,但我宁愿避免这种情况。
答案 0 :(得分:5)
您可以使用snprintf()
:
int size = snprintf(NULL, 0, "as %s.s -o %s.o", argv[i], argv[i]);
if (size < 0) {
return ERROR; // handle error as you like
}
char *p = malloc(++size); // we add the +1 for the nul terminate byte
if (p == NULL) {
return ERROR;
}
int ret = snprintf(p, size, "as %s.s -o %s.o", argv[i], argv[i]);
if (ret < 0) {
free(p);
return ERROR;
}
system(p);
free(p); // if you don't need it anymore
注意:唯一的问题是,由于不明原因,snprintf()
不会返回size_t
。但这是我们可以在std中用来做你想做的事情的唯一功能。