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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2017, 18:09   #1
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию Массив из CHAR строк

Доброго времени суток.
Подскажите, в какую сторону идти при создании массива из строк?
Задача такая: как-нибудь реализовать ввод команд из консоли, чтобы определив первую команду переходило в проверку команд относительно изначально заданной, т.е как то так:
Код:
enable
   - switch
   - mysql
   - ну ещё чего-нибудь
disable
   - switch
   - mysql
   - ну ещё чего-нибудь
Попробовал в массиве типа char *mcmd[][1] = {..}, но не получается определить другую группу.
Загвоздка в переходе на подгруппу, т.е. определил я "enable" и мне надо как то проге сказать "теперь ищи там".
Поделитесь мыслями, пожалуйста.
Tahoma вне форума Ответить с цитированием
Старый 14.06.2017, 19:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вам строку разбить надо? Так просто + есть куча функций и готовых либ.
Или вам логику кода? Тогда конечный автомат вполне подойдет.
p51x на форуме Ответить с цитированием
Старый 15.06.2017, 17:37   #3
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Я думал в сторону массива из структур, но остановился на байтах определения принадлежности. т.е. создал один массив типа:
Код:
char	*mcmd[][1] = {	"\00\01help",  \
						"\00\02hello",	\
						"\00\01?",		\
						"\01\02ok", \
						"\02\03ну привет" 
};
где первый байт - определяет группу, которую надо проверить.
второй - группу, на которую надо перейти.

похоже надо будет третий ещё сделать, чтобы уже с помощью switch выполнять действия.

код получился такой:
Код:
	int num_command = arraycount(mcmd);
	char* buffind = (char*)malloc(num_command);
	memset(buffind, 0, num_command);

	// Сравниваем, по-буквенно, введеную команду с имеющимися
	for (int i = 0; i < strlen(cmd) - 1; i++)
		for (int n = 0; n < num_command; n++)
			if (mcmd[0][n][0] == subcheck)
			{
				if (cmd[i] == mcmd[0][n][i + 2] && buffind[n] != 1)
				{
					buffind[n] = 1;
				}
			}

	// Узнаем сколько команд найдено
	int findcmd = 0;
	for (int n = 0; n < num_command; n++)
	{
		if (buffind[n] != 0)
			++findcmd;
	}

	delete(buffind);
Код "сырой" и пока работает с первой введенной командой. Прикручу потом:
Код:
	/*
	char * pch;
	pch = strtok(cmd, " ");
	printf("\n");
	while (pch != NULL)
	{
		printf("%s\n", pch);
		pch = strtok(NULL, " ");
	}*/
Если есть идеи по реализации более быстрого способа, то я не откажусь их узнать. В принципе для этого и создал тему )
Tahoma вне форума Ответить с цитированием
Старый 15.06.2017, 19:39   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Может лучше структурой?

Код:
struct CommandLine
{
  const char* pszArgumentName;
  CommandLine*  pSubTableIfAny;
  void(*pfnCommandHandler)(int argc, char** argv);
}
Сможете делать произвольный уровень вложений.
waleri вне форума Ответить с цитированием
Старый 17.06.2017, 23:16   #5
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Может лучше структурой?

Код:
struct CommandLine
{
  const char* pszArgumentName;
  CommandLine*  pSubTableIfAny;
  void(*pfnCommandHandler)(int argc, char** argv);
}
Сможете делать произвольный уровень вложений.
Это более удобно в плане кода, но и более затратно в плане памяти. По сути то ничего и не поменяется. Я пока оставил этот вопрос, чтобы не останавливать воплощение самой идеи. Потом взвешу все за и против.
И я благодарен за совет!
Tahoma вне форума Ответить с цитированием
Старый 20.06.2017, 18:43   #6
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Не стал на структуру переходить. В итоге вот что получилось:

Код:
char	*mcmd[][1] = {
	"\00\01help",		\
	"\00\02show",		\
	"\01\02ok",			\
	"\02\03version",	\
	"\02\03run"
};

// Поиск введенной команды
int FindCommand(char* cmd, int subcheck = 0)
{
	char * pch;
	pch = strtok(cmd, " ");
	printf("\n");
	while (pch != NULL)
	{
		int num_command = arraycount(mcmd);
		char* buffind = (char*)malloc(num_command);
		memset(buffind, 0, num_command);

		// Сравниваем, по-буквенно, введеную команду с имеющимися
		//!!!!! надо сделать проверку на ввод знака ?
		int aaa = strlen(pch);
		for (int i = 0; i < (int) strlen(pch); i++)
		{
			if (pch[i] > 0x1f && pch[i] < 0x80)
				for (int n = 0; n < num_command; n++)
				{ 
					if (mcmd[0][n][0] == subcheck && pch[i] == mcmd[0][n][i + 3] && buffind[n] > i-1)
						buffind[n] = i+1;
				}
			else
			{
				pch[i] = 0;
			}
		}

		

		// Узнаем сколько команд найдено
		int findcmd = 0;
		int numfindcmd = 0;;
		for (int n = 0; n < num_command; n++)
		{
			if (buffind[n] == strlen(pch))
			{
				++findcmd;
				numfindcmd = n;
			}
		}

		delete(buffind);

		if (findcmd == 0)
		{
			// Не найдено ни одной команды
			printf("%s\n", ErrInvalidInputCommand);
			break;
		}
		else if (findcmd > 1)
		{
			// Найдено множество команд
			//!!!!! тут надо выводить список всех возможно найденных команд
		}
		else if (findcmd == 1)
		{
			// Команда найдена успешно
			if (mcmd[0][numfindcmd][2] == 0)
			{
				if (mcmd[0][numfindcmd][1] == 0)
				{
					printf("%s\n", ErrInvalidInputCommand);
					break;
				}
				else
				{
					subcheck = mcmd[0][numfindcmd][1];
				}
			}
			else
			{
				RunCommand(mcmd[0][numfindcmd][2]);
				break;
			}
		}

//		printf("%s: %d\n", pch, findcmd);
		pch = strtok(NULL, " ");
	}
	return 0;
}
Тут я реализовал ввод неполных команд, т.е.
show
shell

при вводе sh выдаст две команды.
Такой метод ввода реализован на коммутаторах (про другие программы не знаю)

Последний раз редактировалось Tahoma; 21.06.2017 в 17:20. Причина: исправлены некоторые ошибки
Tahoma вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си. Массив char Bayern_M Помощь студентам 2 17.11.2015 10:39
Программирование с использованием 3 видов строк string, char, stringbuild bufalo Фриланс 5 27.11.2011 14:35
Заполнение массива строк типа char. KuckaMAXHATKA Помощь студентам 3 15.02.2011 21:21
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
c++ массив char 0479 Общие вопросы .NET 2 19.09.2010 23:20