Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gledor
38 / 24 / 9
Регистрация: 12.08.2015
Сообщений: 154
Завершенные тесты: 1
#1

Использование аргументов передаваемых в функцию main - C++

16.09.2015, 12:03. Просмотров 294. Ответов 8
Метки нет (Все метки)

Здравствуйте, дорогие форумчане! мне нужна помощь по интересному вопросу, который я вычитал в книге.
Дело все в том, что я узнал, что в функцию main при запуске программы можно посылать строки, которые потом хранятся в массиве указателей. Что-то вроде флагов перед запуском программы, как в CNU/Linux Bash, например: shutdown now, где now - флаг программы shutdown. Хотя это, в принципе, это и есть те самые, кошерные флаги... Но проблема не в этом! проблема со строками! Ну, допустим, я получил строку... Мне же её надо как-то интерпретировать, и на основе строки выполнить какую - то определенную часть кода... И вот вопрос:
Допустим, у меня есть код:

C++
1
2
3
4
5
int main(int argc, char* argv[])
{
 cout<< argv[0] << endl << argv[1] << endl;
return 0;
}
Так мы получили аргументы, и вывели их на экран. Но это не есть манипуляция. Первое, что приходит на ум, это решить проблему в лоб, сделав так:

C++
1
2
3
4
5
6
7
int main(int argc, char* argv[])
{
 cout<< argv[0] << endl << argv[1] << endl;
if (argv[1] == "--secret-option")
        cout << endl << "Вы воспользовались секретной опцией!" <<endl;
return 0;
}
Но данное решение - не решение, а идиотизм, потому что программа работать не будет! (сравнение со строкой, неопределенность кагбе...)

Вопрос: что мне делать в таком случае. как мне использовать это строку? Неужели мне ради того, чтобы программа стала работать, необходимо написать код переливания "из пустого в порожнее", то есть переводить эту строку-указатель-массив в обычный символьный массив, а потом сравнивать каждый символ для того чтобы понять, что же ввел пользователь? Или заниматься мысленными изворотами с функцией strstr()??? Неужели нет более простого способа? Научите меня, пожалуйста!

И так же я не пойму, что же это за зверь такой,
C++
1
const char* string = "строка";
Это указатель - массив, имеющии свойства константы,
или константный массив, имеющий свойства указателя... блин, короче, что это???
Явно, что это не полноценный тип данных string))
Простите за вопросы, если они идиотские для вас, но честно, инфы не могу нашарить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2015, 12:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование аргументов передаваемых в функцию main (C++):

Вычислить сумму чисел, передаваемых программе в виде аргументов командной строки - C++
Всем доброго дня! Прошу помочь с решением задачи. Начальная задача стояла так: программа должна вычислять сумму чисел, передаваемых ей...

Очищение аргументов функции main - C++
Здравствуйте! Как известно, в функцию main передаются два аргумента: int argc, char** argv Стоит ли использовать delete на argv ради...

Назначение аргументов функции int main - C++
int main(int argc, char *argv) что эти параметры делают и какие у них функции, объясните пожалуйста!

Передача аргументов командной строки функции main() - C++
Добрый день Дана задача: Напишите программу, которая запрашивает пароль, задаваемый в команд- ной строке. Ваша программа не должна...

Написать функцию перестановки данных в двух структурах, передаваемых по ссылке. - C++
Написать функцию перестановки данных в двух структурах, передаваемых по ссылке. Проверить ее работоспособность.

Написать шаблонную, перегруженную функцию которая возвращает минимальный из трех передаваемых в нее параметров - C++
Доброго всем дня! Помогите пожалуйста написать шаблонную, перегруженную функцию которая возвращает минимальный из трех передаваемых в нее...

8
lightfrag
1 / 1 / 1
Регистрация: 19.07.2013
Сообщений: 35
16.09.2015, 12:23 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В литературе очень часто встречается пример создания собственного класса String.
В нем действительно хранится массив типа char.

И юзается он главным образом методами стандартной либы.
(.compare; .erase ; .replace; .insert; .append)
Для свой задачи можешь создать массив строк и сравнивать с передаваемыми из консоли параметрами.
Весь лунуксовый shell именно так и работает.

А char* ptr = "тралала" -- это у тебя переменная ptr хранящая адрес на статически-инициализированное место в блоке кода программы - "тралала". (можешь почитать про стек памяти под программу, если есть интерес на низкоуровном понимании)

Если нужны какието дополнительные манипуляции, то можешь скопровать свою строку в заранее созданный массив:
myString.copy(myCharArray, length, 0)
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2015, 12:29 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
gledor, Для сравнения стоит использовать strcmp. Или что может быть проще, создать std::string из аргумента и вперед.
1
nonedark2008
976 / 716 / 161
Регистрация: 28.07.2012
Сообщений: 1,959
16.09.2015, 12:39 #4
Цитата Сообщение от gledor Посмотреть сообщение
сравнение со строкой, неопределенность кагбе...
А по мне так получится более или менее определенный результат. Справа укаказатель, слева указатель - почему не сравнить?
Цитата Сообщение от gledor Посмотреть сообщение
строку-указатель-массив в обычный символьный массив
А в чем по таоему мнению между ними разница?
Цитата Сообщение от gledor Посмотреть сообщение
Или заниматься мысленными изворотами с функцией strstr()?
Ты других функций для работы со строками не знаешь? Есть ctrcmp.
Цитата Сообщение от gledor Посмотреть сообщение
Это указатель - массив, имеющии свойства константы,
или константный массив, имеющий свойства указателя...
Ты лучше разберись что такое указатель и что такое массив.
То что ты называешь массивом - это просто кусок данных в памяти, то что ты называешь именем массива - это указатель на начало этого куска в памяти, указатель - это просто число, являющееся некоторым адресом в памяти.
Цитата Сообщение от gledor Посмотреть сообщение
const char* string
Это указатель на константу. В твоем случае это указатель на строку, которую нельзя изменить.
Сам указатель изменить можно, но то, на что он указывает, - нет. Может ты не догадываешься, но строка - это обычный массив.
0
gledor
38 / 24 / 9
Регистрация: 12.08.2015
Сообщений: 154
Завершенные тесты: 1
16.09.2015, 13:37  [ТС] #5
Цитата Сообщение от nonedark2008 Посмотреть сообщение
А по мне так получится более или менее определенный результат. Справа укаказатель, слева указатель - почему не сравнить?
Результат работы такой программы из консоли - это фейл в любом случае. У меня результат работы программы обрывается на выводе двух строчек, и заканчивается бесконечно мигающим курсором, который можно гонять вниз при помощи Enter. А компилятор предупреждал... Если бы сравнение было правомочно, это не привело бы к такому результату.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
А в чем по таоему мнению между ними разница?
В случае указателя и обычного массива, это все равно массивы. А разница в том, что указатель char во - первых, скрыт. Я не могу узнать конкретного адреса, где находится массив. Если я вывожу на экран указатель любого типа, мне выдается адрес. В случае с char - фигушки (Ну оно и ясно, это же указатель на массив). Единственное, что я могу - получить отдельный символ при помощи, к примеру, *ptr_tchar. Но действуют некоторые ограничения... В отличие от обычного массива, я могу заменить все элементы указателя на строку другой строкой, но не могу заменить даже отдельный символ при помощи *(ptr_char+x), к примеру. В случае с обычным массивом, все с точностью до наоборот. Ах, да... в случае с указателем, в конец строки автоматически дозаписывается символ "\0". При создании обычного массива, это необходимо делать вручную. В общем, там много других НО и НЕ...
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Ты других функций для работы со строками не знаешь? Есть ctrcmp.
Знаю пока только три. strlen(), strcut(), strstr();

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Ты лучше разберись что такое указатель и что такое массив.
массив - это переменные одного типа, хранящие определенное значение, расположенные друг за другом;
указатель на массив - это адрес первого элемента массива;

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Это указатель на константу. В твоем случае это указатель на строку, которую нельзя изменить.
Сам указатель изменить можно, но то, на что он указывает, - нет. Может ты не догадываешься, но строка - это обычный массив.
мне бы еще знать адрес на строку, хранящийся в указателе, который я не имею возможности получить(или не имею знаний).

Вот если честно, что я вижу: Я вижу указатель, который объявляется и инициализируется при помощи синтаксиса объявления и инициализации обычных переменных, исключая звездочку(*), то есть он "косит под переменную", и очень удачно, потому что я могу вывести хранящуюся строку используя только имя указателя, без звездочки и без индекса элементов. Плюс я так понял, что я не могу получить адрес, хранящийся в указателе на тип char, (получается, это не совсем правомочный указатель?). Мало того, указатель char, указывающий на массив в памяти, пытается косить "под массив", на который указывает, но лишен одного из основополагающих его свойств. Указатель можно поменять, но исправить строку данных, накоторую он указывает, при помощи *( ptr + x ) - невозможно..
Вот впрочем я только поэтому и теряюсь в догадках,что же это такое...

И да, разумеется, строка может быть только массивом, и не иначе.
0
nonedark2008
976 / 716 / 161
Регистрация: 28.07.2012
Сообщений: 1,959
16.09.2015, 14:11 #6
Цитата Сообщение от gledor Посмотреть сообщение
мне бы еще знать адрес на строку, хранящийся в указателе, который я не имею возможности получить(или не имею знаний).
Строку "строка" компилятор автоматически заменяет на указатель на нее.
Но не факт, что если ты два раза в коде напишешь "строка", то получишь один и тот же адрес.
Цитата Сообщение от gledor Посмотреть сообщение
он "косит под переменную"
Он и является переменной, которая хранит в себе число, которое является адресом ячейки памяти, в которой хранится некоторый объект.
Цитата Сообщение от gledor Посмотреть сообщение
я могу вывести хранящуюся строку используя только имя указателя, без звездочки и без индекса элементов.
Просто все звездочки и индексы элементов скрыты от тебя в функциях вывода.
Цитата Сообщение от gledor Посмотреть сообщение
Плюс я так понял, что я не могу получить адрес, хранящийся в указателе на тип char
Его можно узнать многими способами.
char ptr[] = "abc";
cout << (void *)ptr; или int a = (int)ptr;
Или просто научись пользоваться отладчиком. Правда, научись.
Цитата Сообщение от gledor Посмотреть сообщение
получается, это не совсем правомочный указатель?
Очень даже правомочный, просто стандартные средства вывода интерпретируют его как указатель на строку и выводят ее. Попробуй вывести указатель на int.
Цитата Сообщение от gledor Посмотреть сообщение
но исправить строку данных, накоторую он указывает, при помощи *( ptr + x ) - невозможно
Если у тебя указатель на константу, то предполагается что эту константу изменять нельзя.
Даже если ты насильно уберешь константу у указателя, то при изменении данных может выскочить ошибка, т.к. страница в памяти, к которой относится адрес указателя, так же может быть только для чтения.
1
gledor
38 / 24 / 9
Регистрация: 12.08.2015
Сообщений: 154
Завершенные тесты: 1
16.09.2015, 15:46  [ТС] #7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Он и является переменной, которая хранит в себе число, которое является адресом ячейки памяти, в которой хранится некоторый объект.
мммм.... в этом что-то есть... ))) Да, я вроде разобрался! Всем откликнувшимся спасибо за помощь! Мне удалось создать элементарный примерчик;
Пускай он здесь полежит, может, пригодится кому из новичков!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Пример работы функции main с аргументами при запуске программы
#include <iostream>
#include <cstring>
using std::strcmp;
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
    const char* option = "-secret-option";
    if (argc > 1)                                               //Если пришел хоть один дополнительный аргумент (argc > 1 и равен хотя бы одному)
    {
        if (strcmp(argv[1], option) == 0)                       //И этот аргумент -secret-option
            cout << "Вы воспользовались секретной опцией\n";    //Вывести секретную строку на экран
    }
    cout << "Программа выполнена!" << endl;
    return 0;
}
0
Evg
Эксперт CАвтор FAQ
18689 / 6654 / 468
Регистрация: 30.03.2009
Сообщений: 18,617
Записей в блоге: 29
16.09.2015, 18:07 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от gledor Посмотреть сообщение
И так же я не пойму, что же это за зверь такой,
C++
1
const char* string = "строка";
http://www.cyberforum.ru/blogs/18334/blog97.html
2
gledor
38 / 24 / 9
Регистрация: 12.08.2015
Сообщений: 154
Завершенные тесты: 1
16.09.2015, 22:42  [ТС] #9
Очень познавательная статья, прям, сокровнные тонкости) Спасибо!
0
16.09.2015, 22:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2015, 22:42
Привет! Вот еще темы с ответами:

Создать функцию, возвращающую минимальный из трёх передаваемых в неё параметров любого (но одинакового) типа - C++
Функция, возвращающая минимальный из трех передаваемых в нее параметров любого (но одинакового) типа.

Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main - C++
Здравствуйте! Помогите, пожалуйста! Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции...

Использование аргументов командной строки - C++
Всем доброго дня !!! Подскажите пожалуйста как связать этот код программы с командной строкой ? #include &lt;fstream&gt; #include...

Использование массивов в качестве аргументов функции - C++
Написала программу, работает правильно, только не совсем по условию задачи. Помоги пожалуйста исправить. Условие: найти наибольшую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.