2-й вызов strtok() возвращает ноль

Я нахожусь в верхней части цикла while в клиентском файле для связи клиент/сервер. Клиент получает пользовательский ввод (ввод), и мне нужно передать его в cmd и cmd2, чтобы мои ifs работали.

Скажем, пользователь вводит «get lname» (это хорошая команда для программы). Используя следующий код, cmd = "get" (ура!), но cmd2 = "(null)"

input — это char input[30] cmd, а cmd2 — это char*, инициализированные значением NULL.

Небольшая помощь здесь? Спасибо!

    /*Until the user exits the program*/
    while(cmdNum != 7)
    {
        printf("\nPlease enter a command: ");
        scanf("%30s", input);

        cmd = strtok(input, " ");
printf("cmd: %s\n", cmd);

        if(strcmp(cmd, "get") == 0)
        {
            cmd2 = strtok(NULL, "\0");
printf("cmd2: %s\n", cmd2);

            pstatus = print(cmd, sockfd);

            if(pstatus == 1)
            {
                printf("Error printing\n");
            }
        }
        else if(strcmp(cmd, "put") == 0)..... etc, etc....

person airvector222    schedule 23.04.2014    source источник


Ответы (2)


Ваш второй вызов strtok также должен использовать один пробел для аргумента-разделителя, а не "\0", который, если подумать, является просто пустой строкой.

И что еще более важно, вам нужно прочитать всю строку целиком, чего scanf с %s не делает. Он останавливается на первом месте. Вместо этого попробуйте fgets, но помните, что он оставляет новую строку, поэтому добавьте ее в качестве разделителя.

#include <stdio.h>
#include <string.h>

int main() {
    char input[50];

    printf("Please enter a command: ");
    fgets(input, sizeof input, stdin);

    char *cmd = strtok(input, " \t\n");
    printf("cmd: [%s]\n", cmd);

    if (strcmp(cmd, "get") == 0) {
        char *cmd2 = strtok(NULL, " \t\n");
        printf("cmd2: [%s]\n", cmd2);
    }

    return 0;
}
person ooga    schedule 23.04.2014
comment
Все еще не делает этого :( Я переключил его на cmd2 = strtok(NULL,); Все еще возвращает (null) - person airvector222; 24.04.2014
comment
@airvector222 airvector222 Я не уверен, что происходит! Я добавил работающий пример в свой ответ. Но, как вы говорите, он печатает (null). - person ooga; 24.04.2014
comment
Попробуйте распечатать input перед обработкой. Это не имеет ничего общего с strtok(), и все, что связано с scanf(). - person Crowman; 24.04.2014
comment
@PaulGriffiths А-а-а-а-а-а!!! Фокусировка в неправильном месте. Конечно, опция %s читается только до первого пробела! Я исправляю приведенный выше код сейчас. - person ooga; 24.04.2014

После первого вызова strtok передайте NULL в качестве первого параметра. Функция сохраняет статическую переменную, чтобы помнить, где она остановилась.

http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

person Brandon Clements    schedule 23.04.2014
comment
Да, сэр, это то, что я делаю. Нет кубика :( - person airvector222; 24.04.2014