我有这个:
#include <stdio.h>
#include <string.h>
int main(void){
const char* pFilename = NULL;
pFilename = "Something.png"
functionX(pFilename, argX);
}
但是,我想在一个循环中调用该函数,使用不同的文件名,如"Something0.png"、"Something1.png"等
经过一番挖掘,我得出了这个结论:
#include <stdio.h>
#include <string.h>
int main(void){
const char* pFilename = NULL;
char buffer[4];
char nameStd[] = "Something";
char namePng[] = ".png";
char nameAll[17];
pFilename = "Something.png"
for (i = 0; i < 100; i++) {
snprintf(buffer, sizeof(buffer), "%d", i);
strcat(nameAll, pFilename);
strcat(nameAll, buffer);
strcat(nameAll, namePng);
functionX(nameAll, argX);
memset(nameAll,0,strlen(nameAll));
}
}
嗯,我不确定这是否可行。而且我现在不能执行代码(因为functionX
需要特定的外围设备)。但即使它确实可行,这真的是最节省时间的方法吗?
2条答案
按热度按时间wqnecbli1#
组装部件通常要容易得多,可以通过snprintf()(如上所述),也可以自己构建字符串,前缀不会改变,只需要在添加另一个数字时添加后缀,对于1e6字符串,它比
snprintf()
快60%,但可能不值得这么复杂:flvlnr442#
在这种情况下,出于性能原因组装零件是没有意义的:用
snprintf
组成文件名是简单和有效的,并且无论如何比fopen()
便宜得多。以下是一个简化版本:
上面的代码是推荐的方法,对于大多数用途来说足够快了。答案的其余部分只用于教育目的。
如果你真的想压缩开销,你可以尝试直接更新字符串:
下面是一个基准测试示例:
输出:
请注意,在大多数情况下,这种显著的性能改进(27倍)并不能证明这样聪明的代码是合理的:对于你的例子(100次迭代),差别只有30微秒,0,00003秒,几乎不可测量。