C++: как разобрать строку на слова средствами string?
Во встроенном классе string, в отличие от нативных строк char *
, нет такой же удобной функции для разбора на слова, как strtok в классическом C. Свойств вроде DelimitedText, как в VCL, тоже не наблюдается... Меж тем, задача остаётся актуальна, и решить её в простейшем случае можно так (консоль Visual Studio 2010):
#include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; int main() { cout << "Enter the string: "; string str; getline(cin, str); vector <string> vecstr; string word; stringstream s(str); while (s >> word) vecstr.push_back(word); int vsize = vecstr.size(); for (int i = 0; i < vsize; i++) cout << vecstr[i] << endl; cin.get(); return 0; }
Здесь бьётся, в общем, не на слова, а на лексемы, поэтому не исключаются знаки препинания, стоящие последними символами строк vecstr[i]
, а также слова, не содержащие ни одного алфавитно-цифрового символа и т.п. Но направление, в котором можно смотреть для решения задачи, пример показывает :)
Разумеется, ничто не мешает сделать разбор и более традиционными, чем переопределённый оператор, ведь все методы для проверки и извлечения подстрок в классе string
имеются. Например, по аналогии с Паскалем, можно так (по-прежнему дано только базовое разбиение на лексемы, но не анализ отдельных строк):
#include <iostream> #include <string> using namespace std; int main() { string s0 = " I'm a\ttext from some words. "; string c,c0,w; bool inword=false; string divs=" \t\r\n"; string s=" "+s0+" "; int len = s.size(), start; for (int i=1; i<len; i++) { string c0 = s.substr(i-1,1); string c = s.substr(i,1); if (divs.find(c0)!=string::npos && divs.find(c)==string::npos) { inword=true; start=i; } if (divs.find(c)!=string::npos) { if (inword) { w = s.substr(start,i-start+1); //здесь есть очередная лексема w cout << w << endl; } inword = false; } } cin.sync(); cin.get(); return 0; }
05.10.2015, 17:44 [22856 просмотров]