Разделение строки на любое количество пробелов в C
"*\\s"
указывает на неправильное понимание того, как кодировать символы токена."*\\s"
ищет 3 символа *
, \
и s
в качестве токенов, ни один из них не указывает пробелы при использовании с strtok()
.
Анализ строки ввода для белого-пространство с явным списком.Обязательно учитывайте в конце '\n'
строки ввода или другие пробелы .
Пробелы в C включают в себя несколько символов:
Стандартными символами пробела являются следующие: пробел (' '
), перевод формы ('\f'
), новая строка ('\n'
), возврат каретки ('\r'
),горизонтальная табуляция ('\t'
) и вертикальная табуляция ('\v'
).
C11dr §7.4.1.10 2
// while(fgets(100,line,open)!=NULL)
while(fgets(line, sizeof line, open)) { // Destination array is first argument
const char *standard_white_space = " \f\n\r\t\v";
name = strtok(line, standard_white_space);
password = strtok(NULL, standard_white_space);
printf("username : <%s>\n",name);
printf("password : <%s>\n",password);
}
В качестве альтернативы используйте isspace()
или a " "
в sscanf()
.
Совет. Чтобы код не содержал пробелов в username, password
, напечатайте строку с символами часового типа, такими как <>
, чтобы упростить обнаружение ошибок кодирования.
char line[] = "bob passowrd1\n";
char*name = strtok(line, " ");
char* password = strtok(NULL, " ");
printf("username : <%s>\n", name);
printf("password : <%s>\n", password);
Это выводит
username : <bob>
password : <passowrd1 <-- Oops
>