2015-08-13 16 views
-3

我想支持添加到我的程序的东西,让我进入/Input/Images/%03d.png/Output/Images/%03d.blah,但我不知道该怎么做?如何用printf像格式字符串的argv

我已经搜索了格式字符串printfargv的每个组合,我可以想到。

我希望能够将%03d之前的所有内容加载为一个常量,并循环显示%03d以选择多个不同的输入文件,以便将它们读入。所以这将是/Input/Images/000.png,然后是/Input/Images/001.png所有去/Input/Images/999.png

TL;医生我要处理的文件序列,但我不知道该怎么做。

+1

听起来像一个完美的食谱各种格式字符串攻击。 –

+0

您是否尝试对文件名/路径进行模式匹配,或者您是否知道要替换为“%03d”的值? –

+1

你有什么尝试?作为@EugeneSh。写道,这样做会打开攻击,因为'argv'字符串必须作为第一个参数传递给'printf'或'sprintf'。最好将程序参数分成'source'和'dest',然后你可以建立完整的文件名而不用担心损坏。 –

回答

1

你可以这样做。该解决方案在字符串大小检查中留下了很多不足,但基础是这样的。

您输入的路径和文件号基地,并在要处理的批处理文件的数量。

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    unsigned basenum, numfiles, i; 
    char inname[1000], outname[1000]; 

    if (argc < 5) 
     return 1; 
    sscanf(argv[3], "%u", &basenum); 
    sscanf(argv[4], "%u", &numfiles); 
    for (i=0; i<numfiles; i++) { 
     sprintf (inname, "%s/%03u.png", argv[1], basenum + i); 
     sprintf (outname, "%s/%03u.blah", argv[2], basenum + i); 
     //convertimg (inname, outname); 
     printf ("Processed %s to %s\n", inname, outname); 
    } 
return 0; 
} 

程序输入

test aaa dest/bbbb 100 10 

程序输出

Processed aaa/100.png to dest/bbbb/100.blah 
Processed aaa/101.png to dest/bbbb/101.blah 
Processed aaa/102.png to dest/bbbb/102.blah 
Processed aaa/103.png to dest/bbbb/103.blah 
Processed aaa/104.png to dest/bbbb/104.blah 
Processed aaa/105.png to dest/bbbb/105.blah 
Processed aaa/106.png to dest/bbbb/106.blah 
Processed aaa/107.png to dest/bbbb/107.blah 
Processed aaa/108.png to dest/bbbb/108.blah 
Processed aaa/109.png to dest/bbbb/109.blah