如何根据命令行参数的文件扩展名执行特定操作

How to do a specific action depending on the file extension of a command-line argument

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

./program picture.jpg image.jpg

./program picture.ppm image.jpg

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

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

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

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

要测试从末尾算起的第 3 个字符,您可以使用:

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

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

您可以使用 if(strlen(argv[1]) > 3 && argv[1][strlen(argv[1])-3] == 'j')

来保护它

你应该

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

与 Python 不同,其中负数组索引意味着从末尾开始索引,C 中的负数组索引从 start 开始倒数,所以这不是什么你要。

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

在文件名中查找(最后一个)扩展名的最简单方法是使用标准库函数 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 */
}

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

一些使用注意事项:

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

  2. 如果文件名不包含定界符(在这种情况下,.),strrchr returns NULL。如果您尝试使用 return 值而不检查这种情况,您的程序可能会崩溃(并且肯定会调用未定义的行为)。因此,请始终检查 return 值。