БлогNot. C++: как разобрать строку на слова средствами string?

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 просмотров]


теги: c++ textprocessing программирование studio

показать комментарии (2)