我想有一个具有不同类型的特定参数的程序。例如,我像这样启动我的程序:
./program picture.jpg image.jpg
./program picture.ppm image.jpg
现在我希望我的程序能够识别不同的扩展名,jpg
与ppm
。我怎样才能轻松做到这一点?我试过了:
if (argv[1][-3] == j)
{
//do something
}
...
但这不起作用,我在互联网上找不到关于我的问题的任何回复(可能是因为我问得不好......
顺便说一句。我是python程序员,我正在学习c...
你应该
- 检查来自
argc
的参数计数。 - 使用
argv[i]
遍历每个命令行参数,其中i
是从1
到argc-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
,以便您可以将其与各种参数一起使用,而不仅仅是第一个参数。您还希望有某种方法让用户手动指定类型,以防他们想使用名称不正确的文件调用您的程序。
几个使用说明:
像
strlen()
一样,strrchr()
必须扫描其参数中的每个字节。因此,请避免在同一字符串上多次调用它。如果多次需要结果,请将其保存在临时中。如果文件名不包含分隔符(在本例中为
.
(,则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。