Как отрезать путь из аргумента 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
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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем две константы: MAX_LEN_NAME — максимальная длина имени файла, STR_NUM — номер строки, где хранится адрес.
- Задаём значение переменной argc, равное 1. Значит, в командной строке указан только один аргумент.
- Выделяем память под строку name с помощью malloc.
- Инициализируем переменную name_len нулём.
- Вычисляем длину строки adress_len, содержащей адрес файла.
- Начинаем цикл while с условием, что текущий символ адреса не является завершающим символом строки имени файла (в системе Win это обратный слеш).
- Уменьшаем значение i на единицу при каждом шаге цикла while.
- Вычисляем значение name_len как разницу между длиной строки adress_len и i.
- Запускаем цикл for, который будет копировать символы имени файла в строку name.
- Условие цикла for: продолжать цикл, пока текущий символ не является завершающим символом строки имени файла и индекс j меньше значения name_len.
- При каждом шаге цикла for копируем текущий символ из строки argv[1] в строку name.
- Увеличиваем значение i на единицу после каждой итерации цикла while.
- Добавляем нулевой символ в конец строки name.
- Выводим значение переменной name с помощью функции printf.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
- Значение переменной name должно содержать имя файла, указанного в командной строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д