2012-06-30 3 views
2

délimitée Comment puis-je obtenir:chaîne Parse

connect 
100 
username 
example 

de cette chaîne:

ngg://connect>100/username>example/ 

Répondre

3

Ajout d'une réponse avec strtok à cause de la diversité:

char str[] = "ngg://connect>100/username>example/"; 
char *s = strtok(str, ">/"); 
std::vector<std::string> tokens; 
while (s = strtok(NULL, ">/")) 
    tokens.push_back(std::string(s)); 

Ceci partagera la chaîne str dans les jetons désirés (jeter la première ngg:, comme dans la question). Voici un code working example de ce code.

4

En utilisant std::string::find avec des arguments "/" et ">" et std::string::substr avec les indices trouvés.

C'est un bon début.

3
ngg://connect>100/username>example/ 

Si ce format est fixe, vous pouvez utiliser std::sscanf comme:

#include <iostream> 
#include <cstdio> 

int main() 
{ 
    char const *input = "ngg://connect>100/username>example/"; 
    char const *input_format = "ngg://%[^>]>%d/%[^>]>%[^/]"; 

    char connect[100], user[100], str[100]; //assuming max size is 100 
    int num; 

    if (std::sscanf(input, input_format, connect, &num, user, str) != 4) 
    { 
    std::cerr<<"error - number of tokens read must be equal to 4"; 
    return 0; 
    } 

    std::cout << connect <<std::endl; 
    std::cout << num <<std::endl; 
    std::cout << user <<std::endl; 
    std::cout << str <<std::endl; 
} 

sortie (online demo):

connect 
100 
username 
example 
+2

+1 pour l'utilisation correcte de la famille evil scanf. – EvilTeach

3

Une possibilité est boost::split():

#include <iostream> 
#include <vector> 
#include <string> 

#include <boost/algorithm/string.hpp> 
#include <boost/algorithm/string/split.hpp> 

int main() 
{ 
    std::vector<std::string> tokens; 
    std::string s("ngg://connect>100/username>example/"); 
    boost::split(tokens, s, boost::is_any_of("/>")); 

    // "connect" == tokens[2] 
    // "100"  == tokens[3] 
    // "username" == tokens[4] 
    // "example" == tokens[5] 

    return 0; 
}