Как выполнить конкретное действие c в зависимости от расширения файла аргумента командной строки - PullRequest
2 голосов
/ 21 января 2020

Я хочу иметь программу с указанными c аргументами разных типов. Например, я запускаю свою программу так:

./program picture.jpg image.jpg

./program picture.ppm image.jpg

Теперь я хочу, чтобы моя программа распознала различные расширения, jpg против ppm. Как я могу легко это сделать? Я попытался:

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

Но это не работает, и я не могу найти ответ на мой вопрос по inte rnet (возможно, потому что я спрашиваю плохо ...).

кстати. Я python программист и учусь c ...

Ответы [ 4 ]

1 голос
/ 21 января 2020

Самый простой способ найти (последнее) расширение в имени файла - использовать стандартную библиотечную функцию 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 представляющих известные типы расширений, чтобы вы могли использовать его с различными аргументами, а не только с первым. Вы также хотели бы иметь какой-то способ позволить пользователю вручную указывать тип на тот случай, если он захочет вызвать вашу программу с файлом с плохим именем.

Пара замечаний по использованию:

  1. Как и strlen(), strrchr() должен сканировать каждый байт в своем аргументе. Поэтому не вызывайте его более одного раза в одной строке. Если вам понадобится результат более одного раза, сохраните его во временном хранилище.

  2. Если имя файла не содержит разделитель (в данном случае .), strrchr возвращает NULL. Если вы попытаетесь использовать возвращаемое значение без проверки для этого случая, ваша программа, вероятно, обработает sh (и обязательно вызовет Undefined Behavior). Поэтому всегда проверяйте возвращаемое значение.

1 голос
/ 21 января 2020

Вы должны

  • Проверить количество аргументов из argc.
  • L oop для каждого аргумента командной строки, используя argv[i], где i - от 1 до argc-1.
  • используйте strstr(), чтобы проверить, присутствует ли .jpg или .ppm в любой из строк, указатель на argv[i].
0 голосов
/ 21 января 2020

В отличие от Python, где отрицательный индекс массива означает начать индексирование с конца, отрицательный индекс массива в C отсчитывает назад от start , так что это не то, что вам нужно.

Вы можете использовать функцию strstr для поиска ".jpg" или ".ppm" в строке или использовать strlen, чтобы получить длину строки и начать поиск этого индекса -3.

0 голосов
/ 21 января 2020

Для проверки отсчета 3-го символа с конца вы можете использовать:

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

Обратите внимание, что этот метод вызовет неопределенное поведение, если длина аргумента меньше 3 .

Вы можете защитить это с помощью if(strlen(argv[1]) > 3 && argv[1][strlen(argv[1])-3] == 'j')

...