Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Нужно распарсить строку параметров запуска приложения: Код: plaintext 1. Находим пример использования функции strtok: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Проблема в том, что функция обращается к исходной строке, как к массиву (char[]), а в argv хранятся константы (char*). В итоге, приведенный пример работать не будет - если в нем заменить char str[] на char *str, то произойдет ран-тайм-ошибка. Это чтобы пример работал для парсинга, нужно объявить массив, задать ему размер по длине строки, скопировать в него данные... Кривотина какая то получится, прям хоть самому пиши функцию парсинга. Как обойти проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 09:02 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, При вызове main параметры уже разбиты на токены, самому это делать уже не нужно. У тебя же параметр входной в main — это массив строк, массив указателей на char.там уже лежат разбитые на токены строки вызова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 11:28 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybsПроблема в том, что функция обращается к исходной строке, как к массиву (char[]), а в argv хранятся константы (char*). В итоге, приведенный пример работать не будет - если в нем заменить char str[] на char *str, то произойдет ран-тайм-ошибка. Что-то ты гонишь. Не, если в этом примере заменить char str[] на char *str, оно можнт и упадет (от компилятора зависит), но какоен это имееет отношение к argv? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 11:57 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
MasterZiv, ему видимо надо не (только) по пробелам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 11:58 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, Строки в argv точно не константы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 12:10 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybsесли в нем заменить char str[] на char *str, то произойдет ран-тайм-ошибка В нормальных компиляторах в первую очередь произойдет компайл-тайм ошибка, потому что присвоение строкового литерала в неконстантный указатель - это ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 12:13 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybsПроблема в том, что функция обращается к исходной строке, как к массиву (char[]), а в argv хранятся константы (char*). Нет, там хранятся не константы. Даже если там храняться константы, ты можешь предварительно скопировать их в сбой буфер. andreybsВ итоге, приведенный пример работать не будет - Будет, если написать правильно. andreybsесли в нем заменить char str[] на char *str, то произойдет ран-тайм-ошибка. Код показывай... А вообще для этого есть уже готовые компонетны, типа GNU options или boost programm options. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 12:43 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, а вы пробовали? Ф-ция strtok_s ждет тип указателя char *, _именно_ этого типа указатели лежат в массиве указателей argv[]. Просто передавайте во внешнем цикле в стрток_с argv[i] от i=1 до i<argc strtok_s(argv[i], ...); и не морочьте голову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 13:07 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Дайте-ж ему ответить-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 13:11 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Почитал рекомендации, попробовал разное. Выводы такие: Мой проект юникодный, переделал пример под него с wcstok_s: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. - так работает, argv парсится. Не понятно, почему не работает так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. argv[i] объявлен так же, как и str - _TCHAR*. Конечно, argv - массив строк, но ведь каждая строка объявлена как _TCHAR*. Если str объявить типом _TCHAR[] вместо _TCHAR*, то второй пример заработает. Это можно объяснить тем, что в первом случае мы имеем read-only строку, а во втором случае массив (на форуме как-то так описывалась разница в работе char* и char[]). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 19:41 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, Код: plaintext 1. Так нельзя делать Anatoly Moskovskyпотому что присвоение строкового литерала в неконстантный указатель - это ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 19:49 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyandreybs, Код: plaintext 1. Так нельзя делать Anatoly Moskovskyпотому что присвоение строкового литерала в неконстантный указатель - это ошибка Ну почему же? Компилятор это пропускает. И если работать со строкой, как с константой, то ран-тайм ошибки не будет. Код: plaintext 1. 2. 3. Видимо, wcstok_s (и подобные функции) пытаются менять содержимое строки, от того и вылетает ошибка?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 21:45 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybsНу почему же? Компилятор это пропускает. И если работать со строкой, как с константой, то ран-тайм ошибки не будет. Смените компилятор на нормальный. Ну и литерал - это и есть константа. Почему вас удивляет что при попытке изменить ее вы получаете не то что хотели? Работайте с ней как с константой, честно - через const char*. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 23:40 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybsПочитал рекомендации, попробовал разное. Выводы такие: Мой проект юникодный, переделал пример под него с wcstok_s: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. - так работает, argv парсится. Не понятно, почему не работает так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. argv[i] объявлен так же, как и str - _TCHAR*. Конечно, argv - массив строк, но ведь каждая строка объявлена как _TCHAR*. Если str объявить типом _TCHAR[] вместо _TCHAR*, то второй пример заработает. Это можно объяснить тем, что в первом случае мы имеем read-only строку, а во втором случае массив (на форуме как-то так описывалась разница в работе char* и char[]). когда вы объявляете char *str = "ляляля"; или wchar_t *str = L"ляляля"; в ф-ции, вы создаете в стеке переменную _указатель_ на строку, и присваиваете ему адресс строки "ляляля", которую компилятор создает в ридонли секции данных. Когда вы объявляете chаr str[] = "ляляля"; то вы создаете в стеке переменную _массив символов_ - строковой буфер, он конечно writeable. argv[] - это массив указателей на тоже writeable строки, - только они в куче, а не на стеке. И конечно все эти ф-ции пишут в строки, а именно - они меняют по очереди те символы которые вы указали как разделители на NULL. Они не выходят за границы строк, но меняют их разбивая на подстроки токены. Код: c 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 02:20 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСмените компилятор на нормальный. Дык Майкрософт же!? :) VS2012 ultimate со всеми SP... valkotкогда вы объявляете char *str = "ляляля"; или wchar_t *str = L"ляляля"; в ф-ции, вы создаете в стеке переменную _указатель_ на строку, и присваиваете ему адресс строки "ляляля", которую компилятор создает в ридонли секции данных. Когда вы объявляете chаr str[] = "ляляля"; то вы создаете в стеке переменную _массив символов_ - строковой буфер, он конечно writeable. argv[] - это массив указателей на тоже writeable строки, - только они в куче, а не на стеке. И конечно все эти ф-ции пишут в строки, а именно - они меняют по очереди те символы которые вы указали как разделители на NULL. Они не выходят за границы строк, но меняют их разбивая на подстроки токены. Код: c 1. 2. 3. 4. 5. 6. Вполне понятное объяснение, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 10:51 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
Небольшое дополнение. В итоге воспользовался функцией CString::Tokenize. Проста в использовании и не меняет исходную строку в отличие от strtok_s и ей подобных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 21:08 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, а не влом для такой малости в проект MFC засовывать? Просто для решения именно этой цели есть и более легкие библиотеки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 22:38 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
MasterZivandreybs, а не влом для такой малости в проект MFC засовывать? Просто для решения именно этой цели есть и более легкие библиотеки... http://msdn.microsoft.com/en-us/library/vstudio/ekdt199a.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 06:56 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
MasterZiv, CString уже используется в проекте в других местах. Какие более "легкие" решения можете предложить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 08:50 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
andreybs, boost program options, boost regex, gnu getoptions и много других. Кажется, я уже говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 13:26 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
MasterZivandreybs, boost program options, boost regex, gnu getoptions и много других. Кажется, я уже говорил. те прикручивать левую гнуЪ фигню - легче чем родной мфц, который к тому же уже используется в проекте? А чем собственно плох метод использования исходных ф-ций с которых все началось? Ну разбивают они строки ну и чем это здесь плохо? Вы узнаете свои опции, парся эти строки, транслируете это в свое внутреннее представление, принимаете соотв. решения и все, текстовый ввод сделал свое дело. Вы же не будете многократно пережовывать тот текстовый ввод.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 13:48 |
|
||
|
он-лайн преобразование char* в char[]
|
|||
|---|---|---|---|
|
#18+
те прикручивать левую гнуЪ фигню - легче чем родной мфц, который к тому же уже используется в проекте? Там автор говорил где-то про то, что MFC уже используется в проекте ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2013, 19:04 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38418648&tid=2019938]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 283ms |
| total: | 450ms |

| 0 / 0 |
