Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204

Обработка команд (\comand)

01.04.2012, 17:45. Показов 2892. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как можно сделать обработку команд с обратным слешом..

Например \name Tofers

Нужно для консольного чата
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2012, 17:45
Ответы с готовыми решениями:

Векторная обработка данных с использованием SIMD-команд
Составить программу применяющую функцию к входным массивам с получением на выходе массива вычисленных значений с применением инструкций...

Обработка команд из командной строки уже запущенным приложением
Добрый день уважаемые форумчане! Перейду сразу к сути: Необходимо что-бы приложение в запущенном состоянии принимало команды через...

ICQ бот обработка команд
люди помогите с кодом. он полностью работает но надо чуть чуть подправить. procedure TForm2.ICQClient1MessageRecv(Sender: TObject; Msg,...

13
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
01.04.2012, 18:49
Команда \name Tofers - меняет ник, я правильно понимаю?
Думаю вам нужно читать про регулярные выражения. Ну и как-то так:
C#
1
2
3
4
5
6
message = Console.ReadLine();
//если сообщение начинается с символа '\'
if (message[0] == '\\') 
{
Comand(message); //Передаем сообщение на обработку в метод Comand, где выполняется действие взависимости от команды
}
В самом методе Comand с помощью регулярных выражений определяем команду, остальную часть сообщения считаем за атрибут, и выполняем действие

P.S. Я с регулярными выражениями плохо знаком, поэтому попробую вам помочь, заодно закреплю знания
0
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
01.04.2012, 18:53  [ТС]
DimanRu, Да меняет ник
А теперь как обработать ник не изменяя строку ()
Или разбить потом строку на массив и проверять массив?

То есть
C#
1
2
 if mass[0] == "\name"
   name = mass[1];
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
01.04.2012, 20:05
Вот такой код, даже без Regex:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static string[] comand; //Команда
        static string message; //Сообщение
        static string name; //Имя
        static int reputation; //репутация (например)
 
        static void Main(string[] args)
        {
            Console.Write("Введите сообщение: ");
            message = Console.ReadLine();
 
            if (message[0] == '\\') //Если 1ый символ - слэш
            {
                comand = message.Split('\\', ' '); //Ращбиваем сообщение на команду и атрибут
 
                EnterComand(comand[0], comand[1]); //И передаем их в метод
            }
 
            Console.ReadKey();
        }
 
        static void EnterComand(string comand, string attribute)
        {
            switch (comand) //проверяем по команде
            {
                case "name": name = attribute; break; //Если команда = name - меняем ник (\name DimanRu)
                case "rep": reputation = int.Parse(attribute); break; //Если команда = rep - меняем репутацию (\rep 100)
            }
        }
    }
}
1
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
02.04.2012, 18:53  [ТС]
DimanRu, Почему сплит в массив забивает "", "name", "tofers"
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
02.04.2012, 19:21
Потому что он нулевой элемент не обрабатывает, и он автоматически получает нулевое значение.
А да, и поэтому надо передавать 2ой и 3ий элементы массива:
C#
1
EnterComand(comand[1], comand[2]); //И передаем их в метод
0
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
02.04.2012, 19:32  [ТС]
DimanRu, Ну я так и сделал

Осталось сделать чтобы клиент постояно получал сообщение а не после отправки

А еще такой момент.. Если отправлено \name

И нет ника как это проверить? Думал сначало проверять comand[2] но ошибку все равно ведь выдаст
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
02.04.2012, 19:36
Синхронизация что-ли? Можно по таймеру, раз в секунду проверять наличие новых сообщений, или на сервере при обновлении - посылать всем клиентам.
0
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
02.04.2012, 19:44  [ТС]
Вот так сделал:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if (str[0] == '\\') //Если 1ый символ - слэш
                {
                    comand = str.Split('\\', ' ', '\n','\r'); //Разбиваем сообщение на команду и атрибут
                    if (comand[1] == "pm")
                    {
                        string ls = null;
                        for (int i = 3; i < comand.Length; i++)
                            ls += comand[i] + " ";
                        SendToId(comand[2], ls);
                    }
                    else if ((comand.Length == 3) || (comand[1] == "exit")) EnterComand(comand[1], comand[2]); //И передаем их в метод
                    else SendAsync("Ник не задан! Введите команду правильно \name");
                        
                }
                else SendToAll("[" + DateTime.Now.ToString("HH:mm:ss") + "] " + name + ": " + str + "\n");
 
 private void EnterComand(string comand, string attribute)
        {
            switch (comand) //проверяем по команде
            {
                case "name":
                    string temp = Clients[index].name;
                    Clients[index].name = attribute;
                    SendAsync("Вы сменили ник с " + temp + " на " + attribute);
                    break; //Если команда = name - меняем ник (\name NicName)
                case "exit":
                    SendToAll("От нас ушел " + name + " \n");
                    Clients.Remove(Clients[index]);
                    break; //Если команда = exit - удаляем конект из List(\exit)
            }
        }
Сообщение сервер отправляет всем. Но у клиента появляется тогда когда он сообщение отправит..
Принятие сообщений от сервера в бесконечном цикле (Клиент-Сервер Чат) вот код клиента.. Может подскажешь как проверку сделать раз в секунду
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
03.04.2012, 20:36
Хм... проблему конечно уже решили, но если интересует способ с регулярными выражениями, то кидаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Text.RegularExpressions;
 
namespace RegexApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex myReg = new Regex(@"[a-z]+\S\b"); //Создаем образец поиска
            MatchCollection mach = myReg.Matches(Console.ReadLine()); //Ищем по образцу слова введенные с клавиатуры
 
            foreach (Match mat in mach) //Для каждого найденного значения
            {
                Console.WriteLine("Нашел: " + mat); //Выводим
            }
 
            Console.ReadKey(); //Ожидаем нажтия клавиши
        }
    }
}
В результате при вводе \name diman получим name и diman эти значения и можно в дальнейшем передать в метод:
C#
1
EnterComand(mach[0].Value, mach[1].Value);
0
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
04.04.2012, 15:34  [ТС]
DimanRu, Может сможешь как то оптимизировать код а как то самому не нравится

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if (str[0] == '\\') //Если 1ый символ - слэш
{
       comand = str.Split('\\', ' ', '\n', '\r'); //Разбиваем сообщение на команду и атрибут
        
       if (comand[1] == "exit")
       {
            string temp = name;
            SendAsync("Идет отключение от сервера!");
            Clients.RemoveAt(index);
            SendToAll("Вышел из чата  " + temp + "\n");
            Console.WriteLine("Отключился " + temp);
       }
       // если личное сообщение
       else if (comand[1] == "pm")
       {
            string ls = null; // собираем сообщение из массива в переменную
            for (int i = 3; i < comand.Length; i++)
                 ls += comand[i] + " ";
            SendToId(comand[2], ls); // вызываем метод отправки ЛС
        }
        // проверка правильсти команды
        else if (comand.Length == 3) EnterComand(comand[1], comand[2]); 
        //И передаем их в метод
        else SendAsync("Ник не задан! Введите команду правильно!");
}
private void EnterComand(string comand, string attribute)
        {
            switch (comand) //проверяем по команде
            {
                case "name":
                    string temp = Clients[index].name;
                    Clients[index].name = attribute;
                    SendAsync("Вы сменили ник с " + temp + " на " + attribute);
                    break; //Если команда = name - меняем ник (\name NicName)
                default:
                    SendAsync("Команды " + comand + " не существует!\n");
                    break;
            }
        }
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
04.04.2012, 15:50
Вот так наверно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (str[0] == '\\') //Если 1ый символ - слэш
{
    Regex myReg = new Regex(@"[a-z]+"); //Создаем образец поиска
    MatchCollection mach = myReg.Matches(str); //Ищем по образцу слова введенные с клавиатуры
    
    EnterComand(mach[0], mach[1]); //Передаем команду и атрибут в метод
}
 
static void private EnterComand(string comand, string attribute)
{
    switch (comand) //Выполняем нужное действие взависимости от полученой команды
    {
        case "name": /*Меняем имя*/ break;
        case "exit": Exit(); break; //Вызываем метод EXIT
        case "pm": /*Не понял как вы отправляете сообщение*/ break;
    }      
              
statc private void Exit()
{
    SendAsync("Идет отключение от сервера!");
    Clients.RemoveAt(index);
    SendToAll("Вышел из чата  " + name + "\n");
    Console.WriteLine("Отключился " + name);
}
P.S. Спешу потом приду допишу как нормально!
0
 Аватар для tofers
30 / 30 / 10
Регистрация: 07.10.2011
Сообщений: 204
04.04.2012, 16:05  [ТС]
DimanRu, \pm DimanRu Текст сообщения бывает большой и содержит пробелы.

Поэтому сообщение сначала собираю в переменную а потом уже отправляю в метод.
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
04.04.2012, 16:55
А, понял! Ну тут можно собрать его и из MatchCollection.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2012, 16:55
Помогаю со студенческими работами здесь

Прием команд Асинхронная обработка
Привет, есть сервер, на сервер идут команды. connect(SClients,SIGNAL(readyRead()),this, SLOT(slotReadClient())); .... void...

Обработка выбора для нескольких команд
Как правильно организовать обработку выбора для двух ТЧ ( у каждой есть кнопка подбор) Для первой ТЧ &amp;НаКлиенте Процедура...

[Verilog] Обработка команд по формату Intel(D0-D7, WR, CS)
Разбираюсь с Verilog Где можно посмотреть как осуществлять обработку команд подаваемых на D0-D7 по сигналам управления WR и CS ...

.bat обработка команд на пк из списка в файле
Всем привет, я в bat новичок, помогите заставить это работать. Не могу разобраться. Батник должен брать список компов из файла pclist.txt,...

SetLocal и расширенная обработка команд в Windows Batch [Статья]
SetLocal и расширенная обработка команд Часто встречали такую конструкцию ? SetLocal EnableExtensions EnableDelayedExpansion По...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru