Самый простой способ найти (последнее) расширение в имени файла - использовать стандартную библиотечную функцию strrchr
.
. Следующее проверяет, является ли расширение первой команды: Строковый аргумент - .jpg
или .jpeg
или версия в верхнем регистре (например, .JPG
или .Jpeg
). Предполагается, что вы уже убедились, что argv[1]
является действительным, проверив значение argc
.
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
. Если вы попытаетесь использовать возвращаемое значение без проверки для этого случая, ваша программа, вероятно, обработает sh (и обязательно вызовет Undefined Behavior). Поэтому всегда проверяйте возвращаемое значение.