【问题标题】:How to use Printf like format string with argv如何将 Printf 之类的格式字符串与 argv 一起使用
【发布时间】:2015-08-13 17:27:57
【问题描述】:

我正在尝试为我的程序添加一些支持,让我可以输入 /Input/Images/%03d.png /Output/Images/%03d.blah,但我不知道该怎么做?

我已经搜索了我能想到的格式字符串 printfargv 的每种组合。

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

tl;dr 我想处理一系列文件,但我不知道该怎么做。

【问题讨论】:

  • 听起来像是各种格式字符串攻击的完美秘诀。
  • 您是在尝试对文件名/路径进行模式匹配,还是您知道要将什么值替换为 %03d
  • 你试过什么?作为@EugeneSh。写道,这样做会受到攻击,因为argv 字符串必须作为第一个参数传递给printfsprintf。最好将您的程序参数拆分为sourcedest,这样您就可以构建完整的文件名而不必担心损坏。
  • 请更具体一点,您的程序到底应该做什么?你写你想输入/Input/Images/%03d.png /Output/Images/%03d.blah但是然后呢?
  • 这将是一串数字,我在想像 0 表示前导零,3、4、5,无论位数是多少,而 d 与其他程序一样表示十进制采用。我希望能够获取文件的路径,并遍历文件名的数字以选择一组文件。假设有十个文件都命名为 Frame_00x.png,我希望能够采用路径,并将文件名中 x 之前的所有内容作为常量,并循环 x 最多 10 次,所以我可以读取所有这些文件。

标签: c printf argv format-string


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2014-06-23
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多