【问题标题】:How to do a specific action depending on the file extension of a command-line argument如何根据命令行参数的文件扩展名执行特定操作
【发布时间】:2020-05-07 15:18:53
【问题描述】:

我想要一个具有不同类型的特定参数的程序。例如我这样开始我的程序:

./program picture.jpg image.jpg

./program picture.ppm image.jpg

现在我希望我的程序能够识别不同的扩展名,jpgppm。我怎样才能轻松做到?我试过了:

if (argv[1][-3] == j)
{
     //do something
}
...

但这不起作用,我在互联网上找不到任何关于我的问题的答复(可能是因为我问得不好......)。

顺便说一句。我是python程序员,正在学习c...

【问题讨论】:

  • 试试argv[1][strlen(argv[1])-3],负索引在c中不起作用

标签: c parameters main


【解决方案1】:

你应该

  • 检查来自argc 的参数计数。
  • 使用argv[i] 循环遍历每个命令行参数,其中i 是从1argc-1
  • 使用strstr() 来检查.jpg.ppm 是否存在于argv[i] 指向的任何字符串指针中。

【讨论】:

    【解决方案2】:

    在文件名中查找(最后一个)扩展名的最简单方法是使用标准库函数strrchr

    以下检查第一个命令行参数的扩展名是.jpg.jpeg 还是某个大写版本(如.JPG.Jpeg)。它假定您已经通过检查argc 的值确保argv[1] 有效。

    char* extension = strrchr(argv[1], '.');
    if (extension &&
        (0 == strcasecmp(extension, ".jpg")
         || 0 == strcasecmp(extension, ".jpeg"))) {
      /* Handle jpegs */
    }
    else {
      /* Try something else */
    }
    

    实际上,您可能会将其包装到一个函数中,该函数返回某种enum 表示已知的扩展类型,以便您可以将它与各种参数一起使用,而不仅仅是第一个参数。您还希望有一些方法让用户手动指定类型,以防他们想使用名称错误的文件调用您的程序。

    几个使用说明:

    1. strlen() 一样,strrchr() 必须扫描其参数中的每个字节。所以避免在同一个字符串上多次调用它。如果您多次需要结果,请将其保存在临时文件中。

    2. 如果文件名不包含分隔符(在本例中为.),则strrchr 返回NULL。如果您尝试使用返回值而不检查这种情况,您的程序可能会崩溃(并且肯定会调用 Undefined Behaviour)。所以总是检查返回值。

    【讨论】:

      【解决方案3】:

      要测试从最后开始计数的第三个字符,您可以使用:

      if(argv[1][strlen(argv[1])-3] == 'j').

      请注意,如果参数的长度小于 3,此方法将导致未定义的行为。

      您可以使用if(strlen(argv[1]) > 3 && argv[1][strlen(argv[1])-3] == 'j') 来保护这一点

      【讨论】:

      • @no_named_nobody 哦,好的。对于解决方案,使用参数 lenght - 3 查找从末尾开始计数的第 3 个字符,编辑帖子。
      • @Ctx,他们是,感谢您的提醒,看起来您已经给出了答案。
      • 不,我只是发表评论,你给出答案,我刚刚投了赞成票。
      • 一个小补充:由于 OP 想要测试字符,看起来他想要 'j' 而不是 j
      • 请注意,此解决方案会导致长度小于 3 的命令行参数出现未定义的行为。
      【解决方案4】:

      与负数组索引意味着从末尾开始索引的 Python 不同,C 中的负数组索引从 开始 向后计数,所以这不是您想要的。

      您可以使用strstr 函数在字符串中搜索“.jpg”或“.ppm”,或者使用strlen 获取字符串的长度并开始查看该索引-3。

      【讨论】:

        猜你喜欢
        • 2016-08-10
        • 2016-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 2015-03-27
        相关资源
        最近更新 更多