Как мне разобрать токен из строки в C? - PullRequest
4 голосов
/ 17 февраля 2009

Как мне разобрать токены из входной строки. Например:

char *aString = "Hello world".

Я хочу вывод:

«Привет» «Мир»

Ответы [ 5 ]

7 голосов
/ 17 февраля 2009

Вы хотите использовать strtok - , вот хороший пример.

6 голосов
/ 17 февраля 2009

Взгляните на strtok , часть стандартной библиотеки.

4 голосов
/ 18 февраля 2009

strtok - простой ответ, но вам действительно нужен лексер, который делает это правильно. Учтите следующее:

  • Есть ли один или два пробела между "привет" и "мир"?
  • Может ли это быть сколько угодно пробелов?
  • Может ли это включать вертикальный пробел (\ n, \ f, \ v) или только горизонтальный (\ s, \ t, \ r)?
  • Может ли это включать какие-либо символы пробела UNICODE?
  • если бы между словами ("привет, мир") была пунктуация, была бы пунктуация отдельным маркером, частью слова "привет" или игнорировалась?

Как видите, написание правильного лексера непросто, а strtok не является правильным лексером.

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

И, конечно, все это зависит от ваших реальных требований, и я их не знаю, поэтому начните с strtok. Но хорошо знать о различных ограничениях.

3 голосов
/ 17 февраля 2009

Для реентерабельных версий вы можете использовать strtok_s для visual studio или strtok_r для unix

2 голосов
/ 17 февраля 2009

Имейте в виду, что strtok очень трудно понять, потому что:

  • Изменяет ввод
  • Разделитель заменяется нулевым терминатором
  • Объединяет смежные разделители и, конечно же,
  • Не безопасен для потоков.

Вы можете прочитать об этой альтернативе .

...