2015-11-16 2 views
-1

У меня есть strtok для назначения данных переменной cmd из пользовательского ввода. Как я могу определить, пуст ли cmd? Аналогично проверки, если CMD является д, как показано ниже:Обнаружение пустого токена в C

void readcmd() { 
    char read_input[50]; 
    char* cmd; 
    char* param; 

    scanf("%[^\n]%*c",read_input); 
    cmd = strtok(read_input, " "); 
    param = strtok(NULL, " "); 

    if (strcmp(cmd, "q") == 0) { 
     printf("quitting\n"); 
     exit(0); 
    } 

    run(cmd, param); 
} 
+0

что вы подразумеваете под _empty_ ? 'NULL'? –

+3

Если в вашей строке нет действительных токенов, т. Е. Слов, первый вызов 'strtok' возвращает' NULL'. (И вы должны проверить нулевые токены и не передавать их другим функциям. Например, 'strcmp (cmd," q ")' может вылетать, когда 'cmd' является' NULL'.) –

+0

Как и в случае, когда пользователю предлагается ввести вход, они просто нажимают return. – calmcalmuncle

ответ

0

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

Я предполагаю, что вы хотите знать, есть ли какая-либо точка при вызове strtok() вообще, другими словами, содержит ли буфер какие-либо данные для токенизации?

Вы можете установить NUL (\ 0) байт первого символа строки:

read_input[0] = '\0'; 

Затем вызовите Scanf() - после того, как зсапЕ() возвращает вы можете проверить, чтобы увидеть, если первый байт буфер еще NUL байт:

if (read_input[0] != '\0') { 
    /* call strtok() */ 
} else { 
    /* buffer is empty. */ 
} 

Параметр \ 0 не вызовет никаких проблем, когда вы передаете сказать, Е() или strtok(), вы можете по-прежнему использовать Е() для вывода пустой строка, так как байты \ 0 просто передают функции, такие как strtok() и printf(), что они достигли конца строки.

Пример, вы можете вручную пакет строку:

read_input[0] = 'a'; 
read_input[1] = 'b'; 
read_input[2] = 'c'; 
read_input[3] = '\0'; 
printf("%s", read_input); 
0

если (зЬгстр (CMD "") == 0) { ... }