С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221

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

16.09.2015, 12:03. Показов 1388. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2015, 12:03
Ответы с готовыми решениями:

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

Функция проверки равенства средних арифметических двух массивов, передаваемых ей в качестве аргументов
Разработать функцию, которая принимает 2 массива чисел из 4 элементов каждый и проверяет, равны ли у массивов средние арифметические

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

8
 Аватар для lightfrag
1 / 1 / 2
Регистрация: 19.07.2013
Сообщений: 36
16.09.2015, 12:23
Лучший ответ Сообщение было отмечено gledor как решение

Решение

В литературе очень часто встречается пример создания собственного класса String.
В нем действительно хранится массив типа char.

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

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

Если нужны какието дополнительные манипуляции, то можешь скопровать свою строку в заранее созданный массив:
myString.copy(myCharArray, length, 0)
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 12:29
Лучший ответ Сообщение было отмечено gledor как решение

Решение

gledor, Для сравнения стоит использовать strcmp. Или что может быть проще, создать std::string из аргумента и вперед.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
16.09.2015, 12:39
Цитата Сообщение от gledor Посмотреть сообщение
сравнение со строкой, неопределенность кагбе...
А по мне так получится более или менее определенный результат. Справа укаказатель, слева указатель - почему не сравнить?
Цитата Сообщение от gledor Посмотреть сообщение
строку-указатель-массив в обычный символьный массив
А в чем по таоему мнению между ними разница?
Цитата Сообщение от gledor Посмотреть сообщение
Или заниматься мысленными изворотами с функцией strstr()?
Ты других функций для работы со строками не знаешь? Есть ctrcmp.
Цитата Сообщение от gledor Посмотреть сообщение
Это указатель - массив, имеющии свойства константы,
или константный массив, имеющий свойства указателя...
Ты лучше разберись что такое указатель и что такое массив.
То что ты называешь массивом - это просто кусок данных в памяти, то что ты называешь именем массива - это указатель на начало этого куска в памяти, указатель - это просто число, являющееся некоторым адресом в памяти.
Цитата Сообщение от gledor Посмотреть сообщение
const char* string
Это указатель на константу. В твоем случае это указатель на строку, которую нельзя изменить.
Сам указатель изменить можно, но то, на что он указывает, - нет. Может ты не догадываешься, но строка - это обычный массив.
0
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
16.09.2015, 13:37  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
А по мне так получится более или менее определенный результат. Справа укаказатель, слева указатель - почему не сравнить?
Результат работы такой программы из консоли - это фейл в любом случае. У меня результат работы программы обрывается на выводе двух строчек, и заканчивается бесконечно мигающим курсором, который можно гонять вниз при помощи Enter. А компилятор предупреждал... Если бы сравнение было правомочно, это не привело бы к такому результату.

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

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

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

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

И да, разумеется, строка может быть только массивом, и не иначе.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
16.09.2015, 14:11
Цитата Сообщение от gledor Посмотреть сообщение
мне бы еще знать адрес на строку, хранящийся в указателе, который я не имею возможности получить(или не имею знаний).
Строку "строка" компилятор автоматически заменяет на указатель на нее.
Но не факт, что если ты два раза в коде напишешь "строка", то получишь один и тот же адрес.
Цитата Сообщение от gledor Посмотреть сообщение
он "косит под переменную"
Он и является переменной, которая хранит в себе число, которое является адресом ячейки памяти, в которой хранится некоторый объект.
Цитата Сообщение от gledor Посмотреть сообщение
я могу вывести хранящуюся строку используя только имя указателя, без звездочки и без индекса элементов.
Просто все звездочки и индексы элементов скрыты от тебя в функциях вывода.
Цитата Сообщение от gledor Посмотреть сообщение
Плюс я так понял, что я не могу получить адрес, хранящийся в указателе на тип char
Его можно узнать многими способами.
char ptr[] = "abc";
cout << (void *)ptr; или int a = (int)ptr;
Или просто научись пользоваться отладчиком. Правда, научись.
Цитата Сообщение от gledor Посмотреть сообщение
получается, это не совсем правомочный указатель?
Очень даже правомочный, просто стандартные средства вывода интерпретируют его как указатель на строку и выводят ее. Попробуй вывести указатель на int.
Цитата Сообщение от gledor Посмотреть сообщение
но исправить строку данных, накоторую он указывает, при помощи *( ptr + x ) - невозможно
Если у тебя указатель на константу, то предполагается что эту константу изменять нельзя.
Даже если ты насильно уберешь константу у указателя, то при изменении данных может выскочить ошибка, т.к. страница в памяти, к которой относится адрес указателя, так же может быть только для чтения.
1
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
16.09.2015, 15:46  [ТС]
Цитата Сообщение от 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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.09.2015, 18:07
Лучший ответ Сообщение было отмечено gledor как решение

Решение

Цитата Сообщение от gledor Посмотреть сообщение
И так же я не пойму, что же это за зверь такой,
C++
1
const char* string = "строка";
https://www.cyberforum.ru/blogs/18334/blog97.html
2
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
16.09.2015, 22:42  [ТС]
Очень познавательная статья, прям, сокровнные тонкости) Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2015, 22:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru