2009-07-29 2 views
2

Программа принимает строку с использованием getline и передает эту строку функции, где она хранит строку в подстроках, разделенных пробелами. Я сделал это, просто прочитав символы с помощью цикла.Обнаружение строкового аргумента в цикле

Однако теперь я пытаюсь передать второй строковый аргумент, который разделяет строки на подстроки, если цикл встречает символы во втором строковом аргументе. Это то, что у меня есть до сих пор.

#include "std_lib_facilities.h" 

vector<string> split(const string& s, const string& w) // w is second argument 
{ 
    vector<string> words; 
    string altered; 
    for(int i = 0; i < s.length(); ++i) 
    { 
     altered+=s[i]; 
     if(i == (s.length()-1)) words.push_back(altered); 
     else if(s[i] == ' ') 
     { 
      words.push_back(altered); 
      altered = ""; 
     } 
    } 

    return words; 
} 



int main() 
{ 
    vector<string> words; 
    cout << "Enter words.\n"; 
    string word; 
    getline(cin,word); 
    words = split(word, "aeiou"); // this for example would make the letters a, e, i, o, 
            // and u divide the string 
    for(int i = 0; i < words.size(); ++i) 
      cout << words[i]; 
    cout << endl; 
    keep_window_open(); 
} 

Однако, очевидно, что я не могу сделать что-то вроде

if(s[i] == w) 

потому что s [я] является голец и вес является строкой. Нужно ли использовать stringstream для синтаксического анализа строки вместо цикла, который я реализовал? Я действительно играл со струнным потоком, но на самом деле не знаю, как это могло бы помочь, потому что в любом случае мне нужно прочитать символы 1 на 1.

P.S. Аргументы для split должны быть переданы как строки, а форма ввода в main() должна быть getline.

+0

Похоже, что, основываясь на ограничениях на использование строк и getline в вашей P.S., это может быть домашнее задание. Если да, используйте тег «домашняя работа» на свой вопрос. –

+0

Это не так. Самообучение из книги. – trikker

ответ

6

Посмотрите на std::string::find_first_of. Это позволяет легко запросить объект std :: string для позиции следующего из любых символов в другом строковом объекте.

Например:

string foo = "This is foo"; 
cout << foo.find_first_of("aeiou"); // outputs 2, the index of the 'i' in 'This' 
cout << foo.find_first_of("aeiou", 3); // outputs 5, the index of the 'i' in 'is' 

Edit: упс, неправильная ссылка

+0

Получение не соответствующей функции для ошибки вызова, а заголовок строки является частью заголовка объектов. Weird. – trikker

+0

Получил работу. – trikker

+0

Большинство функций поиска, подкачки и т. Д. Расположены под . – jkeys

0

Вы можете использовать strtok для этой цели. Он уже реализован в библиотеках STL.

 
#include 
#include 

int main() 
{ 
    char str[] ="- This, a sample string."; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str," ,.-"); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " ,.-"); 
    } 
    return 0; 
} 
Смежные вопросы