Как отрезать путь из аргумента 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 должно содержать имя файла, указанного в командной строке.