2010-11-12 3 views
5

Possible en double:
How do I tokenize a string in C++?Fractionnement d'une ligne en C/C++ en utilisant les espaces comme séparateur

pseudocode:

Attributes[] = Split line(' ') 

Comment?

Je fais ceci:

char *pch; 
    pch = strtok(line," "); 
    while(pch!=NULL) 
    { 
     fputs (pch, stdout); 


    } 

et d'obtenir un non-écrit, coincé, le fichier de sortie. Quelque chose ne va pas avec ça? Eh bien, la chose ne répond même pas à mon exigence de pseudocode, mais je suis confus sur la façon d'indexer les jetons (en tant que tableaux char) à mon tableau, je suppose que je devrais écrire un tableau à 2 dims.

+3

La solution est différente selon que vous utilisez C ou C++. – dreamlax

+17

Que diriez-vous de certains des exemples de ce qui suit: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Ils sont très efficaces et assez élégant. La bibliothèque String Toolkit rend le traitement de chaînes complexe en C++ simple et facile. –

Répondre

5

Ce n'est pas tout à fait un dup - pour C++ voir et upvote la réponse acceptée here par @Zunino.

Code de base ci-dessous mais pour voir toute l'élégance glorieuse de la réponse, vous allez devoir cliquer dessus.

#include <iostream> 
#include <string> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

int main() { 
    using namespace std; 
    string sentence = "Something in the way she moves..."; 
    istringstream iss(sentence); 
    copy(istream_iterator<string>(iss), 
      istream_iterator<string>(), 
      ostream_iterator<string>(cout, "\n")); 
} 

Ceci repose sur le fait que, par défaut, istream_iterator traite les espaces comme séparateur. Les jetons résultants sont écrits sur cout sur des lignes distinctes (par séparateur spécifié dans la surcharge du constructeur pour ostream_iterator).

+0

Je l'ai utilisé, merci. – andandandand

8

Utilisez strtok avec " " comme délimiteur.

+0

C'est génial pour C, pour C++ voir question connexe dans ma réponse. –

1

La méthode la plus simple est boost::split:

std::vector<std::string> words; 
boost::split(words, your_string, boost::is_space()); 
Questions connexes