如何根据命令行参数的文件扩展名执行特定操作
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
现在我希望我的程序能够识别不同的扩展名,jpg
与 ppm
。我怎样才能轻松做到?我试过了:
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
是从 1
到 argc-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
表示已知的扩展类型,这样您就可以将它与各种参数一起使用,而不仅仅是第一。您还希望有一些方法让用户手动指定类型,以防他们想使用命名错误的文件调用您的程序。
一些使用注意事项:
与 strlen()
一样,strrchr()
必须扫描其参数中的每个字节。因此,请避免在同一个字符串上多次调用它。如果您多次需要结果,请将其临时保存。
如果文件名不包含定界符(在这种情况下,.
),strrchr
returns NULL
。如果您尝试使用 return 值而不检查这种情况,您的程序可能会崩溃(并且肯定会调用未定义的行为)。因此,请始终检查 return 值。
我想要一个包含不同类型特定参数的程序。例如我这样开始我的程序:
./program picture.jpg image.jpg
./program picture.ppm image.jpg
现在我希望我的程序能够识别不同的扩展名,jpg
与 ppm
。我怎样才能轻松做到?我试过了:
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
是从1
到argc-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
表示已知的扩展类型,这样您就可以将它与各种参数一起使用,而不仅仅是第一。您还希望有一些方法让用户手动指定类型,以防他们想使用命名错误的文件调用您的程序。
一些使用注意事项:
与
strlen()
一样,strrchr()
必须扫描其参数中的每个字节。因此,请避免在同一个字符串上多次调用它。如果您多次需要结果,请将其临时保存。如果文件名不包含定界符(在这种情况下,
.
),strrchr
returnsNULL
。如果您尝试使用 return 值而不检查这种情况,您的程序可能会崩溃(并且肯定会调用未定义的行为)。因此,请始终检查 return 值。