Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
#1

Выполнение программы в терминале с поддержкой ключей с аргументами - C++

07.07.2010, 13:00. Просмотров 1631. Ответов 16
Метки нет (Все метки)

Подскажите пожалуйста или дайте ссылку если это уже было на форуме..
как сделать выполнение программы в терминале с поддержкой ключей с аргументами.

Например:
# prog -s 12 -n 5
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
07.07.2010, 17:29     Выполнение программы в терминале с поддержкой ключей с аргументами #2
Распечатает все аргументы командной строки

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int
main (int argc, char **argv)
{
  int i;
 
  for (i = 0; i < argc; i++)
    printf ("%s\n", argv[i]);
 
  return 0;
}
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 18:12  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #3
А отличается чем-то **argv от *argv[]?
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
08.07.2010, 19:42     Выполнение программы в терминале с поддержкой ключей с аргументами #4
Alexoy, **argv на 1 символ короче
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 20:07     Выполнение программы в терминале с поддержкой ключей с аргументами #5
Цитата Сообщение от Alexoy Посмотреть сообщение
А отличается чем-то **argv от *argv[]?
Это одно и то же. Вторая запись концептуально более правильная. Первая - более распространённая
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 20:08  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #6
EASYBUDDA.. Это в корне всё меняет

А вот.. я сделал, допустим, что после определённого ключа выводится следующее слово (просто cout). Если мне надо вывести несколько слов как одно целое - их пишу в одинарных кавычках.. или в обычных кавычках. Но - если при обычных кавычках во фразе есть знак "!", то выводится:

bash: !": event not found

Да.. возможно так и должно быть, но можно это избежать как-то? При одинарных кавычках всё нормально.. символ как символ воспринимается
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 20:14     Выполнение программы в терминале с поддержкой ключей с аргументами #7
Цитата Сообщение от Alexoy Посмотреть сообщение
Но - если при обычных кавычках во фразе есть знак "!", то выводится:
bash: !": event not found
Это фича командного интерпретатора (в твоём случае bash). Специальные символы надо экранировать

Код
$ ./myprog abc "edf" "g\!e"
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 20:17  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #8
Но тогда "word\!" и выводится как word\! . Может отфильтровать из вывода как-то обратный слеш?
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
08.07.2010, 20:19     Выполнение программы в терминале с поддержкой ключей с аргументами #9
Alexoy, заключайте параметры в одинарные ковычки и голову себе не морочьте...
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 20:22  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #10
Так это Я.. но не объяснять же потом всем подряд правописание команд да и наверняка это не так сложно сделать?!
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 20:30     Выполнение программы в терминале с поддержкой ключей с аргументами #11
Alexoy, и тем не менее. От твоей программы это не зависит. В каком виде попадут аргументы (ты их называешь "ключи") в программу зависит только от командного интерпретатора.

Пр слэш перед восклицательным знаком - значит я ошибся. Но на память тогда не скажу, как правильно, надо экспериментировать. Как вариант напиши одинарные кавычки, как предложено выше
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 21:12  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #12
Хотя, я подумал, зачем фильтровать слеш если его там не должно быть?! ну ладно - одинарные так одинарные

Добавлено через 6 минут
ещё момент.. в каком виде данные возвращает argv[]? Как уже убедился - складывать значения сразу нельзя - это не числа (ну это понятно), но это и не строка - strlen() не работает. что-то такое выдаёт:

error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’

"char" ведь одиночный символ, разве нет?
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 21:27     Выполнение программы в терминале с поддержкой ключей с аргументами #13
Что-то я вопроса не поянял. argv - это указатель на массив, элементами которого являются указатели на строки (char'ы)

Добавлено через 52 секунды
Тут рисунок бы хорошо нарисовать, да я вот рисовать не умею на фотошопе
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 21:31  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #14
т.е. Допустим надо узнать длину вписанного ключа/аргумента.. Но strlen() не работает как у простой строки. Наверное совсем не о том я говорю..?! не опытный я)
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 21:35     Выполнение программы в терминале с поддержкой ключей с аргументами #15
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int
main (int argc, char **argv)
{
  int i;
 
  for (i = 0; i < argc; i++)
    printf ("arg=%s, len=%d\n", argv[i], strlen (argv[i]));
 
  return 0;
}
Или я что-то не так вопрос понимаю?
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
08.07.2010, 21:42  [ТС]     Выполнение программы в терминале с поддержкой ключей с аргументами #16
Цитата Сообщение от Evg Посмотреть сообщение
strlen (argv[i])
да, именно про него я говорю.. (кстати у меня этот пример не компилируется)

т.е. strlen не хочет так просто узнавать длину argv[i]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2010, 21:55     Выполнение программы в терминале с поддержкой ключей с аргументами
Еще ссылки по теме:

Некорректное выполнение программы C++
Выполнение программы в облаке C++
Зациклить выполнение программы C++
Неправильное выполнение программы C++
Как продолжить выполнение программы? C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17274 / 5528 / 345
Регистрация: 30.03.2009
Сообщений: 15,041
Записей в блоге: 26
08.07.2010, 21:55     Выполнение программы в терминале с поддержкой ключей с аргументами #17
Цитата Сообщение от Alexoy Посмотреть сообщение
да, именно про него я говорю.. (кстати у меня этот пример не компилируется)
Что пишет-то? Или там просто #include <string.h> не хватает?

Переписал пример немного более понятнее:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
int
main (int argc, char **argv)
{
  int i;
  char *s;
 
  for (i = 0; i < argc; i++)
    {
      s = argv[i];
      printf ("arg=%s, len=%d\n", s, strlen (s));
    }
 
  return 0;
}
Код
$ ./a.out qwery "zxcv bnm mm" '!!!'
arg=./a.out, len=7
arg=qwery, len=5
arg=zxcv bnm mm, len=11
arg=!!!, len=3
Yandex
Объявления
08.07.2010, 21:55     Выполнение программы в терминале с поддержкой ключей с аргументами
Ответ Создать тему
Опции темы

Текущее время: 01:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru