Как отрезать путь из аргумента argv[1] и оставить только название файла? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Во время операции

Drag and Drop

в качестве аргумента

argv[1]

передаётся полный путь к файлу, который мы берём и бросаем на экзешник консольной утилиты. И это отрабатывает правильно. Но, у меня утилитка устроена таким образом, что из этого аргумента подставляется

название файла

в создаваемый файл

d0.pdb

. То есть, когда я натравливаю на утилиту файлы через консоль или через батник, тогда всё нормально прописывается в выходном файле, вот так:
  • ../../../../dev_usb000/

    demo1.pkg

А когда кидаю мышкой файл

demo1.pkg

на утилиту, тогда туда прописывается полный путь вот так, что не правильно:
  • ../../../../dev_usb000/C:\PSDK3v3\MinGW\msys\1.0\home\ErikP\Bubble_Maker\

    demo1.pkg

То есть, в строках от №117 исходного кода за это отвечает вот этот массив:
  i = 0;
  memset (download_url, 0, sizeof(download_url));
  strcpy (download_url, "../../../../dev_usb000/");
  strcat (download_url, pkg_path);
strcpy - начало строки пути strcat - вторая часть пути, в которой подставляется название файла. Помогите мне справиться с этой задачей! Вот исходный код с готовой утилитой:

Bubble_Maker.zip

Решение задачи: «Как отрезать путь из аргумента argv[1] и оставить только название файла?»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_LEN_NAME        25      //Максимальная длинна имени
#define STR_NUM             1       //номер строки, где храниться адрес.
 
int main(int argc, char ** argv)
{
    char * name = (char *)malloc(sizeof(char) * MAX_LEN_NAME);
    int name_len = 0;
    int adress_len = strlen(*(argv + STR_NUM));
    int i = adress_len;
    while(*(*(argv + STR_NUM) + i) != '\\')  //В системе Win работает. на иных ОС, нужно смотреть куда наклон
        i--;
    i++;
    name_len = adress_len - i;
 
    for(int j = 0; (*(*(argv + STR_NUM) + i) != '\0') && j < name_len; j++)
        *(name + j) = *(*(argv + STR_NUM) + i++);
    *(name + name_len) = '\0';
    printf("%s\n", name);
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем две константы: MAX_LEN_NAME — максимальная длина имени файла, STR_NUM — номер строки, где хранится адрес.
  3. Задаём значение переменной argc, равное 1. Значит, в командной строке указан только один аргумент.
  4. Выделяем память под строку name с помощью malloc.
  5. Инициализируем переменную name_len нулём.
  6. Вычисляем длину строки adress_len, содержащей адрес файла.
  7. Начинаем цикл while с условием, что текущий символ адреса не является завершающим символом строки имени файла (в системе Win это обратный слеш).
  8. Уменьшаем значение i на единицу при каждом шаге цикла while.
  9. Вычисляем значение name_len как разницу между длиной строки adress_len и i.
  10. Запускаем цикл for, который будет копировать символы имени файла в строку name.
  11. Условие цикла for: продолжать цикл, пока текущий символ не является завершающим символом строки имени файла и индекс j меньше значения name_len.
  12. При каждом шаге цикла for копируем текущий символ из строки argv[1] в строку name.
  13. Увеличиваем значение i на единицу после каждой итерации цикла while.
  14. Добавляем нулевой символ в конец строки name.
  15. Выводим значение переменной name с помощью функции printf.
  16. Возвращаем 0, чтобы указать, что программа успешно завершилась.
  17. Значение переменной name должно содержать имя файла, указанного в командной строке.

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы