Как разделить пользовательское предложение на слова в C ++ с использованием substr и найти? - PullRequest
1 голос
/ 19 января 2012

Я использовал эту функцию, но она неверна.

for (int i=0; i<sen.length(); i++) {
    if (sen.find (' ') != string::npos) {
        string new = sen.substr(0,i);
    }
cout << "Substrings:" << new << endl;
}

Спасибо! Любая помощь приветствуется!

Ответы [ 4 ]

1 голос
/ 19 января 2012

new - это ключевое слово в C ++, поэтому первый шаг - не использовать его в качестве имени переменной.

После этого вам нужно поместить оператор вывода в блок if, чтобы ему действительно был разрешен доступ к подстроке. Области применения является критически важным в C ++.

0 голосов
/ 19 января 2012

Это не использует substr и find, поэтому, если это домашнее задание, и вы должны его использовать, тогда это не будет хорошим ответом ... но я верю, что это лучший способ сделать то, что вы просите в C ++. Это не проверено, но должно работать нормально.

//Create stringstream and insert your whole sentence into it.
std::stringstream ss;
ss << sen;

//Read out words one by one into a string - stringstream will tokenize them
//by the ASCII space character for you.
std::string myWord;
while (ss >> myWord)
    std::cout << myWord << std::endl;  //You can save it however you like here.

Если это домашнее задание, вы должны пометить его как таковое, чтобы люди придерживались задания и знали, как вам помочь и / или не помогут, чтобы они его не отдавали :)) 1004 *

0 голосов
/ 19 января 2012

Нет необходимости перебирать строку, find уже делает это. По умолчанию поиск начинается с начала, поэтому, как только мы нашли пробел, нам нужно начать следующий поиск из этого найденного пробела:

std::vector<std::string> words;

//find first space
size_t start = 0, end = sen.find(' ');

//as long as there are spaces
while(end != std::string::npos)
{
    //get word
    words.push_back(sen.substr(start, end-start));

    //search next space (of course only after already found space)
    start = end + 1;
    end = sen.find(' ', start);
}

//last word
words.push_back(sen.substr(start));

Конечно, это не обрабатывает повторяющиеся пробелы, начальные или конечные пробелы и другие особые случаи. На самом деле было бы лучше использовать поток строк:

#include <sstream>
#include <algorithm>
#include <iterator>

std::istringstream stream(sen);
std::vector<std::string> words(std::istream_iterator<std::string>(stream), 
                               std::istream_iterator<std::string>());

Затем вы можете просто выпустить их так, как вам нравится, или просто сделать это прямо в циклах без использования вектора:

for(std::vector<std::string>::const_iterator iter=
    words.begin(); iter!=words.end(); ++iter)
    std::cout << "found word: " << *iter << '\n';
0 голосов
/ 19 января 2012

Первое: это не может быть скомпилировано, потому что new является ключевым словом языка.

Затем у вас есть цикл, проходящий через каждый символ в строке, поэтому вам не нужно использовать std::string::find. Я бы использовал std::string::find, но тогда условие цикла должно быть другим.

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