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



我想有一个具有不同类型的特定参数的程序。例如,我像这样启动我的程序:

./program picture.jpg image.jpg
./program picture.ppm image.jpg

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

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

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

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

你应该

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

在文件名中查找(最后一个(扩展名的最简单方法是使用标准库函数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。如果您尝试使用返回值而不检查这种情况,您的程序可能会崩溃(并且肯定会调用未定义的行为(。因此,请始终检查返回值。

要测试从末尾开始的第 3 个字符计数,您可以使用:

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

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

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

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

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

最新更新