как токен полной строки ввода в с? - PullRequest
0 голосов
/ 17 апреля 2011

Мне нужно разобрать строку из cmd, которая выглядит так

"SOME WHITE SPACE" "var_name" "SOME WHITE SPACE" "var_value" "SOME WHITE SPACE"

Я беру всю строку с помощью fgets:

fgets(input_buf,MAX_LINE_LENGTH,stdin);

и попытался токенизировать так:

sscanf(input_buf,"%s", var_buff);

sscanf(input_buf+strlen(var_buff),"%s", var_val_buff);

sscanf(input_buf+(strlen(var_buff)+strlen(var_val_buff)+2),"%s", rest_line_buff);

if (strlen(rest_line_buff) == 0)

    printf("error in usage\n");

Я не могу получить правильные значения, так как количество пробелов может варьироваться. Как я могу токенизировать строку ввода?

Ответы [ 4 ]

2 голосов
/ 17 апреля 2011

Используйте strtok, как показано в примере программы ниже:

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

int main ()
{
  char sampleInput[] ="foo bar foo1 bar1 foo2 bar2";
  char *token;
  char *whiteSpace = " \t\n\f\r\v";
  int isVariable = 1;

  token = strtok(sampleInput, whiteSpace);
  while (token != NULL)
  {
     if (isVariable) 
        printf("Variable = %s\n", token);
     else 
        printf("Value = %s\n\n", token);
     isVariable = isVariable ? 0 : 1;
     token = strtok(NULL, whiteSpace);
  }
  return 0;
}

Выход:

Variable = foo
Value = bar

Variable = foo1
Value = bar1

Variable = foo2
Value = bar2
1 голос
/ 17 апреля 2011

Все функции из семейства scanf объединяют и пропускают несколько пробельных символов по умолчанию:

sscanf(input_buf," %s %s", var_buff, var_val_buf);

Я не уверен, что начальные пробелы в строке формата строго необходимы, но я уверен, что это правильнособытие, если в начале строки ввода нет фактических пробелов.

0 голосов
/ 17 апреля 2011

Кажется естественным использовать здесь strtok( ) или strtok_r( ).Почему ты решил против этого?

0 голосов
/ 17 апреля 2011

Используйте генератор сканера: http://en.wikipedia.org/wiki/Lexical_analysis#Lexer_generator или загрузите библиотеку токенизатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...