Как токенизировать строку без форсирования? - PullRequest
0 голосов
/ 01 августа 2011

Я работаю в C ++.У меня есть следующая строка:

2011-07-01T14: 32: 39.1846579 + 02: 00

Может кто-нибудь сказать мне, как я могу извлечь 2011-07-01 14:32 в другую строку

Ответы [ 4 ]

4 голосов
/ 01 августа 2011

Вы можете взглянуть на std :: istringstream и его оператор >> (но не такой явный, как sscanf).

2 голосов
/ 01 августа 2011

Если у вас есть C ++ 11, самое простое решение будет использовать обычные expresssions. Также возможно использовать std::istringstream, особенно если у вас есть дополнительные манипуляторы, например, соответствие один символ (Если вы этого не сделаете, вы, вероятно, должны. Проблема происходит достаточно часто.) Для чего-то такого простого, однако, оба эти решения могут быть сочтены излишними: std::find для 'T', затем для ' ' даст вам итератор для каждого из двух символов, а Конструкторы двойного итератора std::string дадут вам строки, например ::1006

std::string::const_iterator posT = std::find( s.begin(), s.end(), 'T' );
std::string::const_iterator posSpace = std::find( posT, s.end(), ' ' );
std::string date( s.begin(), posT );
std::string time( posT != posSpace ? posT + 1 : posT , posSpace );

(Вам, вероятно, понадобится лучшая обработка ошибок, которую я предоставил.)

2 голосов
/ 01 августа 2011

Я думаю, что sscanf - это то, что вы ищете:

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

Затем вы можете использовать snprintf для переформатирования данных.

0 голосов
/ 01 августа 2011

вы можете использовать strsep() или strtok_r(), чтобы разбить эту строку на то, что вы хотите с вашими разделителями (в вашем случае 'T' и ':').

...