2009-07-29 9 views
2

Le programme prend une chaîne à l'aide de getline, puis passe cette chaîne à une fonction où elle stocke la chaîne dans des sous-chaînes séparées par des espaces. Je l'ai fait juste en lisant des caractères avec une boucle.Détection d'un argument de chaîne dans une boucle

Cependant, maintenant j'essaie de passer un deuxième argument de chaîne qui sépare les chaînes en sous-chaînes si la boucle rencontre des caractères dans l'argument 2ème chaîne. C'est ce que j'ai jusqu'ici.

#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(); 
} 

Cependant, il est évident que je ne peux pas faire quelque chose comme

if(s[i] == w) 

parce que s [i] est char et w est une chaîne. Ai-je besoin d'utiliser une chaîne pour analyser la chaîne à la place de la boucle que j'ai implémentée? En fait, je jouais avec la stringstream, mais je ne sais pas vraiment comment cela pourrait aider parce que, de toute façon, je dois lire les caractères 1 par 1.

P.S. Les arguments à scinder doivent être passés en tant que chaînes, et le formulaire d'entrée dans main() doit être getline.

+0

Il semble, basé sur les restrictions sur l'utilisation des chaînes et getline dans votre P.S., que cela puisse être devoirs. Si c'est le cas, veuillez utiliser le tag "devoirs" sur votre question. –

+0

Ce n'est pas. Auto-apprentissage du livre. – trikker

Répondre

6

Regardez std::string::find_first_of. Cela vous permet de demander facilement à un objet std :: string la position du caractère suivant d'un autre objet chaîne.

Par exemple:

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: oups, mauvais lien

+0

Obtention de la fonction sans correspondance pour l'erreur d'appel, et l'en-tête de chaîne fait partie de l'en-tête des fonctions. Bizarre. – trikker

+0

Ça a marché. – trikker

+0

La plupart des fonctions de type Rechercher, Permuter, etc. se trouvent sous . – jkeys

0

Vous pouvez utiliser strtok à cet effet. Il est déjà implémenté dans les bibliothèques 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; 
} 
Questions connexes