|
0 / 0 / 0
Регистрация: 20.09.2018
Сообщений: 70
|
|
Строка: Вывести только название последнего каталога, имя файла и расширение из полного пути к файлу...16.10.2018, 14:07. Показов 11812. Ответов 34
Метки нет (Все метки)
Задана строка, содержащая полный путь к файлу, начиная с диска. Вывести только название последнего каталога, имя файла и расширение.
Вроде просто, надо сделать перебор сначала, дойти до второго \ и вывести всё, что было до него, или удалить всё, что после него вместе с ним. Только вот как это изобразить не знаю.
0
|
|
| 16.10.2018, 14:07 | |
|
Ответы с готовыми решениями:
34
Выделить из полного пути к файлу только имя файла Из полного пути к файлу выделить только имя файла
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 18.10.2018, 14:25 | |||||||
Сообщение было отмечено else aaa как решение
Решение
1
|
|||||||
|
0 / 0 / 0
Регистрация: 20.09.2018
Сообщений: 70
|
|
| 18.10.2018, 14:33 [ТС] | |
|
hoggy, огромное спасибо. Был бы очень благодарен, если бы вы объяснили хоть примерно, как это работает.
0
|
|
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
|||||||||||||||||||
| 18.10.2018, 16:15 | |||||||||||||||||||
Сообщение было отмечено else aaa как решение
РешениеУже то, что никому кроме Microsoft эти "безопасные" функции даром не нужны, говорит об их полезности. Ну и да, при их использовании тут на форуме каждый раз приходится копать весь файл, выкидывая эту гадость заодно с <conio.h> и _getch() чтобы хотя бы проверить работоспособность. Кликните здесь для просмотра всего текста
Для ТСа поясню, что модификатор m перед типом данных указывает scanf'у самостоятельно выделить память. Что, собственно, отражено в комментарии к коду.
hoggy
Не хотите автовыделения памяти, можно сделать так:
scanf("%2047s", str); Ввод строки. Число перед модификатором ограничивает количество вводимых символов, чтобы при переполнении данные не записывались куда не надо. К сожалению, не существует стандартного* способа задать это количество через переменную. Впрочем, есть обходной путь: fgets(str, 2047, stdin);. В отличие от обычного форматного ввода, концом строки служит только перевод строки ('\n') или конец строки ('\0'), но не пробелы или табуляции. Кроме того, последний символ (тот же '\n') также попадает в строку. В ряде случаев это удобно, в ряде - нет.pos1 = strrchr(str, sym); Функция strchr() ищет первое вхождение символа sym в строку str. Функция strrchr - последнее. И возвращает указатель на этот символ, то есть куда-то в середину строки. Если символа в строке нет - возвращает NULL. Именно это мы дальше и проверяем: если в строке нет ни одного слеша, печатаем всю строку.pos1[0]=0;pos2 = strrchr(str, sym);pos1[0]=sym; Вот тут немного хитрый момент. Функция strrchr ищет последний символ, но его му уже нашли, значит надо "обрезать" строку, чтобы функция до него не дошла. Поэтому мы говорим что "на этом месте строка кончается", то есть записываем вместо слеша символ конца строки '\0', после чего ищем слеш в оставшейся строке. Далее возвращаем стертый символ на место чтобы не портить строку.if(!pos2)pos2 = str;Аналогично предыдущему случаю: если в строке был только один слеш (сохраненный в pos1), то просто выводим строку целиком, если же нет, то выводим начиная с найденной позиции. Правда, прямо в найденной позиции находится этот самый слеш, так что сдвигаемся на один символ вправо.
1
|
|||||||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 18.10.2018, 16:53 | |||||||
|
и комитету заодно (да да, безопасные версии функций завезли в стандарт) мне твоё мнение по этому вопросу не интересно.
в моей версии нет этого маразма. наверное очень умным себя считаешь? моя версия работает. там есть ссылочка на онлайн компилятор. можно жмакнуть и проверить.
0
|
|||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
||||||||||||
| 18.10.2018, 19:05 | ||||||||||||
Хотя ты не поймешь, что такое следование стандартам, кроссплатформенность и переносимость. Поскольку "есть только Майкрософт и нет жизни вне его, аминь!" Добавлено через 46 минут
0
|
||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 19.10.2018, 12:27 | ||||||
|
https://en.cppreference.com/w/c/io/fscanf профакапил говнястый рудимент от господина COKPOWEHEU когда ты на эту фряху в первый раз указал: вот ни разу не очевидно из какой это строки. я думал - которая в конце функции. то что там ещё где то есть фряха - мне даже в голову не пришло (нормальные люди делают одну секцию зачистки данных) а теперь, если у тебя есть мозги, подумай сам: и почему то это гнутое расширение не взлетело на каэле вижул студии?
0
|
||||||
|
Неэпический
|
|
| 19.10.2018, 13:01 | |
|
COKPOWEHEU, стандарт C11 вводит функции с суффиксом _s, но не требует их обязательной поддержки.
Так что начиная с C11 функция scanf_s является стандартной, просто реализация может её не поддерживать. Добавлено через 4 минуты Ать: Что значит ошибка error C2660: strcpy_s: функция не принимает 2 аргументов? Два: При вызове конструктора ошибка: L "Buffer is too small" & & 0
0
|
|
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
||||||||||
| 19.10.2018, 14:02 | ||||||||||
|
В отличие от твоего, мой код работает. И выделение-освобождение памяти расставлены там где надо. А уж если ты собрался "исправлять", то разберись как он работал и в каких местах это может всплыть. Кстати, а где ТС писал какой компилятор использует? Не в 15 ли посте, уже после того, как я предложил решение? Собственно, я же уже кидал ссылку на прошлое обсуждение. Но могу еще раз кинуть. Если вкратце: hoggy как и сейчас кинулся махать флагом "Microsoft бог, все что реализовано в msvs - стандарт", но предсказуемо сел в лужу, где, судя по поведению, и пребывает до настоящего момента.
0
|
||||||||||
|
Неэпический
|
|
| 19.10.2018, 14:41 | |
|
COKPOWEHEU, так оно теперь стандарт.
Раньше - если нет функций _s, то компилятор не поддерживает это нестандартное расширение. Сейчас - если нет функций _s, то компилятор не поддерживает эту стандартную возможность. Необязательность чего либо в C - обычное явление.
0
|
|
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
|||
| 19.10.2018, 15:28 | |||
|
Существует некоторый базовый набор команд, которые стандарт обязывает поддерживать, и набор рекомендуемых расширений. Также есть кучка сторонних стандартов, тот же gnu, определяющий свои конструкции.
Так вот, пока функция не вошла в первую категорию, на нее полагаться нельзя и она ничем не отличается от любой другой нестандартной. И зачем их в таком случае вообще добавили в стандарт? Лично мое мнение
1. Кроме MS это никому не нужно, все более-менее опытные программисты знают о граблях в этих функциях и умеют обходить, а синтаксис _s функций слишком громоздкий и неудобный. Все равно лучше бы в scanf добавили модификатор задания длины строки по аналогии с модификатором "%n" и "%123s". В чем смысл strcpy_s тоже непонятно если есть strncpy
2. Какие-то политические причины. Возможно, следование моде "изображать безопасность".
0
|
|||
|
Заблокирован
|
|||||||
| 19.10.2018, 15:45 | |||||||
1
|
|||||||
|
Неэпический
|
|||||
| 19.10.2018, 15:57 | |||||
|
И даже массивы переменной длины(VLA), которые всегда преподносят как базовую возможность C, на самом деле являются необязательными для поддержки. Не знаю, это вопрос не ко мне
Выше ссылочка, там цитата из стандарта, что мол предоставляем более безопасные версии. Ряд проверок от программиста пропадает, пользуйте, если хотите. ![]() strncpy не проверяет аргументы на NULL.А может всё ради макроса, который позволяет понять, что эти функции есть? ![]() Лично я их не использовал никогда.
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
|||||||||
| 19.10.2018, 16:34 | |||||||||
|
Да и вообще, все эти проверки проверок - не в стиле Си ("мы считаем, что программист знает что делает, и если делает именно так, то ему это зачем-то нужно"), а скорее Java или C#. ![]() ![]() Правда, можно уменьшение i перенести повыше, это еще чуть-чуть упростит код
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 20.09.2018
Сообщений: 70
|
|
| 20.10.2018, 18:35 [ТС] | |
|
COKPOWEHEU, Что такое strlen(path) и break?
0
|
|
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,095
|
|
| 21.10.2018, 08:46 | |
|
Вообще-то, вам было бы полезнее найти ответы на эти вопросы самостоятельно. Так же, как и раньше на форматную строку "%ms".
strlen() - функция определения длины строки. В данном случае мы переходим к последнему элементу, с которого начнем поиск слешей. break - оператор выхода из цикла или switch.
1
|
|
| 21.10.2018, 08:46 | |
|
Разделение полного пути к файлу на диск, директории, имя и расширение Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога. Дана строка, содержащая полное имя файла. Выделить из этой строки название последнего каталога
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
Сразу отвечу: А в PvP с ним. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|