Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Параметры командной строки

289
14 сентября 2001 года
Jeyson
207 / / 20.04.2000
Когда требуется отследить один параметр командной строки (в DOS), то проблем не возникает, но если требуется ввести второй параметр через пробел (или даже несколько пробелов!!! (за пользователем не уследишь)), то возникают проблемы. В данный момент я делаю следующим образом коммандную строку сохраняю в переменной типа char[](массив1)затем в другой массив(массив2) записываю то что до пробела (1-ый параметр), в третий массив(массив3) - то, что после пробела. Потом преобразую получившиеся массивы(2-ой и 3-й) в целые числа и сохраняю их в переменных типа int.
При этом эти два массива (2 и 3) видимо ссылаются на одну и ту же область памяти, т.к. удаление символа в одном массиве приводит к удалению символа в другом массиве.
Вопрос как можно обойти это отслеживание пробелов, может быть есть функция, которая командную строку сразу разбивает на параметры? (прошу написать подробно)
Уточнение это в С++ Builder , т.е функция WinMain и ее параматры немного другие, нежели в main под DOS.
Благодарю за помощь

[ Это Сообщение было отредактировано Jeyson в 2001-09-17 0553 ]
861
16 сентября 2001 года
Darksawa
31 / / 20.09.2000
В книге написано
int main(int argc, char** argv)
Дальше
argc - к-во параметров
argv - i-параметр
если ввели "что-нибудь с пробелом, но в кавычках", то это 1 параметр - без кавычек - несколько.
289
21 сентября 2001 года
Jeyson
207 / / 20.04.2000
<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD>Quote<HR></TD></TR><TR><TD><FONT SIZE=-1><BLOCKQUOTE>
On 2001-09-16 1715, Darksawa wrote
В книге написано
int main(int argc, char** argv)
Дальше
argc - к-во параметров
argv - i-параметр
если ввели &quot;что-нибудь с пробелом, но в кавычках&quot;, то это 1 параметр - без кавычек - несколько.

</BLOCKQUOTE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE>
Это более или менее понятно (спасибо за разъяснение). Но это приложение под Windows и за запуск приложения отвечает функция WinMain (если я правильно понимаю), а ее параметры несколько отличаются
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR csStr, int)
{
....
}
csStr - это и есть коммандная строка (грубо говоря) Есть ли какие-то функции, которые принимают первый параметр (до пробела в ком. строке), а затем второй параметр (после пробела). Может быть тут надо работать с указателями (кстати как это сделать?)?
Благодарю за помощь.
861
22 сентября 2001 года
Darksawa
31 / / 20.09.2000
Так реши чего-нить : DOS OR MustDie?
449
26 сентября 2001 года
Fantasist
124 / / 20.06.2000

А как эта строка передается? Если ее можно преобразовать в строку, хоть какую-нибудь(хотя бы в тот же *char) так и проанализировать можно, что там до пробела и что там после.
289
26 сентября 2001 года
Jeyson
207 / / 20.04.2000
Она передается в функцию WinMain(...) в качестве параметра. И она по моему типа char, т.е. в массив charXX[] я ее могу загнать. Но отслеживание пробелов такая волокита. Может какая-то функция есть, которая сама читает до пробела как отдельную строку, и после пробела тоже как отдельную строку, ну или типа этого. Короче, чтобы самому не отслеживать.
Может есть какой-то другой вариант?
Прошу прощения за мое неведение в элементарных вещах
Благодарю за внимание к моему вопросу.
449
26 сентября 2001 года
Fantasist
124 / / 20.06.2000
Наверняк, в Билдере все эти функции уже описанны. Надо просто хелп посмотреть. А можно и че нить свое написать, типа того,что ниже.А строка в С++ нуль-терменированная. Соответсвено есть указатель на ее начало и символ конца строки.Насколько я помню в С++, и массив (по крайней мере символьный) тоже указатель. То есть сама переменная указывает на его начало, а то что в скобках, как бы смещение.

Классный это язык С++, а!!?


[ Это Сообщение было отредактировано Fantasist в 2001-09-26 1928 ]
449
26 сентября 2001 года
Fantasist
124 / / 20.06.2000
Вот незадача! Позабыл я слегка С++. И подрукой ничего нет... Так что извеняйте за синтаксис и за не проверенность, но вот такое забавное решение

(Тут этот $%#! сообщение повидимому в HTML переделывает и потому все лишнии пробелы выбрасываются. Так что '.' - это пробел)

int pos(char* s,char subst)
{
int i=1;
while ((*s!=subst)&amp;&amp;(*s!='\0'))
{ s++; i++;};
if (*s!=subst) {return 0;}
else {return i;};
};

char* TakeNextSubStr(char* &amp;s)
{
char* s1=s;
int i=0;
i=pos(s,' ');
if (i!=0)
{s=s+i-1; *s=' '; s++;};
return s1;
};


Идея вобщем такова, что функция pos возвращает позицию нужного символа в строке (0 если символ не найден), а функция TakeNextSubStr ставит null-терминатор вместо первого найденного пробела, сдвигает исходный указатель в позицию сразу после помещенного null-терминатора, а возвращает исходный указатель до его изменения. То есть
из
.s
.|
&quot;str1 str2 str3&quot;\0

делает

.TakeNextSubStr
.........|
........&quot;str1&quot;\0&quot;str2 str3&quot;\0
.......................|
.......................s
Помоему в плюс плюсе можно так char* s=&amp;charXX, или char* s=&amp;charXX[0].

[ Это Сообщение было отредактировано Fantasist в 2001-09-27 0527 ]
449
26 сентября 2001 года
Fantasist
124 / / 20.06.2000

Что-то тут проблемы с редактированием.

И спасибо,Jayson, за ответ.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог