Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2010, 22:38   #1
kin63camapa
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 48
По умолчанию Аккуратно обработать параметры

Хотел сделать такую конструкцию:
Код:
#include <iostream>

int main (int argc, char * argv[])
{
    if (argc == 2)
    {
        switch (argv[1])
        {
            case "v":
            case "-v":
            case "--v":
                std::cout << "version\n";
                break;
            case "--help":
                std::cout << "help\n";
                break;
        }
    }
    return 0;
}
но компилятор говорит switch quantity not an integer как я понял это значит что в операторе свитч нельзя использовать массивы и пользовательские типы данных¸ хотелось бы узнать есть ли общепринятые способы обработки параметров или всё через if_ы делают?

Последний раз редактировалось kin63camapa; 07.03.2010 в 22:41. Причина: уродское форматирование
kin63camapa вне форума Ответить с цитированием
Старый 07.03.2010, 22:47   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Для сравнения строк и пользовательских типов приходится использовать конструкции if-else, switch их не воспринимает. К тому же для си-строк не пойдет простое
Код:
char str[];
if (str == "string") {}
это сравнение указателей, нужно
Код:
if (strcmp(str, "string") == 0) {}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.03.2010, 22:52   #3
kin63camapa
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 48
По умолчанию

ну я так и делаю просто
Код:
if ( !strcmp(argv[1],"v") || !strcmp(argv[1],"V") || !strcmp(argv[1],"Ver") || !strcmp(argv[1],"ver") || !strcmp(argv[1],"version") || !strcmp(argv[1],"Version")
|| !strcmp(argv[1],"-v") || !strcmp(argv[1],"-V") || !strcmp(argv[1],"-Ver") || !strcmp(argv[1],"-ver") || !strcmp(argv[1],"-version") || !strcmp(argv[1],"-Version")
|| !strcmp(argv[1],"--v") || !strcmp(argv[1],"--V") || !strcmp(argv[1],"--Ver") || !strcmp(argv[1],"--ver") || !strcmp(argv[1],"--version") || !strcmp(argv[1],"--Version")
|| !strcmp(argv[1],"/v") || !strcmp(argv[1],"/V") || !strcmp(argv[1],"/Ver") || !strcmp(argv[1],"/ver") || !strcmp(argv[1],"/version") || !strcmp(argv[1],"/Version"))
        {
            std::cout << "\n\nEasy CPU speed test v0.0.1 alpha.\nKIN kin63@list.ru 2010\n\n\n";
            return 0;
        }
выглядет по меньшей мере трудночитаемо
kin63camapa вне форума Ответить с цитированием
Старый 09.03.2010, 00:40   #4
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Вместо того, чтобы загонять все проверки в один if, заведи массив строк, в котором перечисли все варианты. А потом в цикле делай сравнение при помощи strcmp с каждым из вариантов, до тех пор, пока варианты не закончатся, или пока не встретишь нужный вариант.
Чтобы эта процедура не выглядела громоздкой, её можно вынести в отдельную функцию. Например, так:

Код:
#include <iostream>
#include <cstring>

using namespace std;

int checkVersion(char* arg);

int main(int argc, char* argv[])
{
	if (argc == 2 && checkVersion(argv[1]))
		cout << "Version\n";

	// Делаем дела
	return 0;
}

int checkVersion(char* arg)
{
	char* variants[] = {"v", "V", "Ver", "ver", "version", "Version", 
			    "-v", "-V", "-Ver", "-ver", "-version", "-Version",
			    "--v", "--V", "--Ver", "--ver",
			    "--version", "--Version",
			    "/v", "/V", "/Ver", "/ver", "/version", "/Version",
			    "" /* Этот элемент нужен для сигнализировании об окончании массива. Другой путь - определить константу, содержащую число элементов в массиве*/
			};
	int res = 0;
	int i = 0;

	do
	{
		if (strcmp(arg, variants[i]) == 0)
		{
			res = 1;
			break;
		}
		i++;
	} while (variants[i][0] != '\0');

	return res;
}

Последний раз редактировалось kogemrka; 09.03.2010 в 00:42. Причина: мелкие правки пунктуации
kogemrka вне форума Ответить с цитированием
Старый 09.03.2010, 09:59   #5
kin63camapa
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 48
По умолчанию

Спасибо, полезная функция.
kin63camapa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать в поток параметры? И как из потока параметры достать? Anekdot Общие вопросы Delphi 2 19.02.2010 22:40
Не могу обработать исключение CrazyXaoc C++ Builder 10 17.02.2010 14:56
Как обработать ошибку XAOC-forever Работа с сетью в Delphi 11 24.09.2008 20:13
Как обработать следующую ситуацию? Tanuska___:) БД в Delphi 5 09.09.2008 12:47
Как обработать исключение? XPAiN БД в Delphi 9 16.05.2008 15:09