Создание команды ввода (не знаю, как ее назвать)

Я не совсем уверен, как это назвать, так как английский не мой родной язык. Я разрабатываю простую программу для болтовни, используя winsock2.h в качестве домашнего задания.

Я застрял на том, чтобы делать команды. Например, когда мой пользователь вводит «/u имя пользователя» в потоке cin, я хочу иметь возможность изменить имя пользователя на то, которое он установил.

В настоящее время я отправляю на сервер все, что вводит пользователь, и позволяю серверу определять, что делать со строками c.

Итак, в этом случае мой сервер получает «/u имя_пользователя/0». Как отделить «/u/0» от строки c и обнаружить ее?

void ServerGame::ProcessTalkLine(char * inStream, unsigned int size, unsigned int id_client)
{
if (size >= 2)  //Any commands would need /'character', which is two character or more
{
    //I have no idea how to do it....
}

else
    sendTalkPackets(inStream, size, id_client);
}

person user2418426    schedule 09.11.2014    source источник
comment
Звучит так, как будто вы хотите токенизировать свой ввод.   -  person shuttle87    schedule 09.11.2014
comment
@ shuttle87 Я читал, что strtok токенизирует строки c, но понятия не имею, что это на самом деле означает.   -  person user2418426    schedule 09.11.2014
comment
Токенизатор берет строку и разбивает ее на отдельные части, которые мы называем токенами. Итак, у вас есть строка с командами и аргументами, разделенными разделителями (в данном случае пробелами). Итак, когда у вас есть /u username, вы действительно хотите разделить его на токены /u, за которыми следует username. Когда вы это сделаете, вам будет намного проще работать с вводом, поскольку вы можете просто проверить первый токен на тип команды, а затем извлечь все, что вам нужно, из следующего токена.   -  person shuttle87    schedule 09.11.2014


Ответы (1)


В зависимости от того, сколько у вас команд (или насколько сложны некоторые из них), следующая идея может быть не слишком хорошей... но для первого запуска она сработает.

void ServerGame::ProcessTalkLine(char * inStream, unsigned int size, unsigned int id_client)
{
    if ((inStream == NULL) || (size == 0))
    {
        return;
    }

    if (inStream[0] == '/')   // inStream may contain a command
    {
        if ((size > 3) && (inStream[1] == 'u') && (inStream[2] == ' '))   // inStream contains /u command?
        {
            /* process change of user name */
            printf("changing user name to %s\n", &(inStream[3]));
            return;   // stop here since message is processed!
        }

        /*
        ** strtok blueprint:
        pCommand = strtok(&(instream[1]), " ");    // input string is everything behind the '/'

        if (!strcmp(pCommand, "u"))   // /u username
        {
            username = strtok(NULL, "\0");   // get rest behind pCommand

            // process command

            return;
        }

        if (!strcmp(pCommand, "test"))   // /test arg1 arg2
        {
            arg1 = strtok(NULL, " ");   // get next token
            arg2 = strtok(NULL, "\0");   // get the rest...

            // process command

            return;
        }         
        */
    }

    sendTalkPackets(inStream, size, id_client);
}

Если у вас есть много более сложных команд, вы можете заглянуть в strtok. .

Кроме того, обратите внимание, что все строковые функции автоматически "удаляют" (останавливают обработку) символ "\0", так как он завершает строку. Поэтому вы должны убедиться, что каждая строка имеет в конце символ '\0'. В противном случае, если вы вызовете строковую функцию, она будет обрабатывать всю вашу память, пока не найдет '\ 0'...

person Lukas Thomsen    schedule 09.11.2014
comment
Что ж, у меня будет несколько команд, и я собираюсь расширить их в будущем. Если бы я использовал strtok, как бы я это сделал? Есть ли пример, на который вы можете мне указать? Пример на странице действительно сбивает с толку. Или проведите меня через пример. - person user2418426; 09.11.2014
comment
@user2418426 user2418426 Я обновил свой ответ планом strtok. Все дополнительные переменные должны быть типа char *. В моем плане токены разделены пробелами. Поэтому токены не могут содержать пробелы. - person Lukas Thomsen; 09.11.2014