2011-10-27 3 views
3

Donc, j'ai écrit cela en C, donc sscanf scanne en s, mais le supprime, puis scanne en d et le stocke. Donc si l'entrée est "Hello 007", Hello est scanné mais rejeté et 007 est stocké dans d.C++ CIN vs C sscanf

static void cmd_test(const char *s) 
{ 
    int d = maxdepth; 
    sscanf(s, "%*s%d", &d); 
} 

Donc, ma question est comment puis-je faire la même chose mais en C++? éventuellement en utilisant stringstream?

Répondre

5
#include <string> 
#include <sstream> 

static void cmd_test(const char *s) 
{ 
    std::istringstream iss(s); 
    std::string dummy; 
    int d = maxdepth; 
    iss >> dummy >> d; 
} 
1

Qu'en est-:

#include <string> 
#include <sstream> 

static void cmd_test(const std::string &s) 
{ 
    int d = maxdepth; 
    std::string dont_care; 
    std::istringstream in(s); 
    in >> dont_care >> d; 
} 
3

Vous ne pouvez pas vraiment extraire dans une chaîne anonyme, mais vous pouvez juste faire un mannequin et l'ignorer:

#include <string> 
#include <istream> 
// #include <sstream> // see below 

void cmd_test(std::istream & iss) // any std::istream will do! 
{ 

    // alternatively, pass a `const char * str` as the argument, 
    // change the above header inclusion, and declare: 
    // std::istringstream iss(str); 

    int d; 
    std::string s; 

    if (!(iss >> s >> d)) { /* maybe handle error */ } 

    // now `d` holds your value if the above succeeded 
} 

Notez que l'extraction pourrait échouer, d'où le conditionnel que je mets. C'est à vous de décider ce que vous faites en cas d'erreur; la chose C++ à faire serait de lancer une exception (bien que si votre fonction actuelle communique déjà des erreurs, vous pourriez juste return une erreur).

Exemple d'utilisation:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    cmd_test(std::cin); 

    std::ifstream infile("myfile.txt"); 
    cmd_test(infile); 

    std::string s = get_string_from_user(); 
    std::istringstream iss(s); 
    cmd_test(iss); 
} 
+0

Peut-être que le changement de l'argument de 'const char *' 'un istringstream' est un peu lourd? –

+0

+1 pour avoir mentionné la gestion des erreurs. – ildjarn

+0

@ChristianRau: Qui sait ... l'OP semble être sur le cas concernant les flux de chaînes, peut-être qu'il a déjà un flux qui traîne quelque part. Sinon, vous pouvez en construire un à partir d'un 'const char *' si vous préférez. J'ai ajouté un commentaire. –