Question

tout le monde. Je suis un programmeur C expérimenté essayant d'obtenir ajusté à C ++. Je voudrais faire l'équivalent de cette déclaration C ...

sscanf(str, "%s %s", sub1, sub2);

... mais avec objet chaîne de C ++. Dis str est « Bonjour tout le monde », en faisant la déclaration de sscanf ci-dessus mettrait « bonjour » en SUB1 et « monde » dans SUB2. Je sais que je peux utiliser les fonctions C comme en C ++, mais je voudrais utiliser le C ++ objet chaîne au lieu d'un tableau de caractères. Je l'ai essayé ceci:

string q, h, w;
cout << "Type \"hello world\": ";
cin >> q;
istringstream x(q);
x >> h >> w;
if (h == "hello")
    cout << "Yes!\n";
else
    cout << "No!\n";
if (w == "world")
    cout << "Yes!\n";
else
    cout << "No!\n";

Mais il sort « Oui! Non! », Ce qui signifie qu'il a pris le « bonjour » mais pas le « monde ». Toutes les idées?

Était-ce utile?

La solution

C'est parce que le operator>> utilisé avec cin ne capturera l'expression « bonjour », et arrêtera au premier delimiter (dans ce cas, un espace). Si vous voulez capturer la ligne d'entrée entière jusqu'à la première ligne delimiter tapé par l'utilisateur, vous devrez utiliser getline(cin, q). La version à deux arguments de getline() utilise un saut de ligne comme séparateur, mais il existe une version à trois arguments qui vous permet de spécifier un caractère sur mesure ligne delimiter ainsi.

Autres conseils

Ne jamais utiliser iostreams sans vérification d'erreur. Comme le dit Jason, lisez la ligne, pas seulement un jeton, mais même alors faire vérifier les erreurs:

std::string line;

if (std::getline(std::cin, line))
{
    std::string h, w;
    std::istringstream iss(line);

    if (iss >> h >> w)
    {
        // success
    }
    else
    {
        std::cerr << "Error reading your input.\n";
    }
}
else
{
    std::cerr << "Error reading from stdin!\n";
}

Vous pouvez faire les ifs en boucles si vous voulez continuer à lire.

En fait, vous pouvez vérifier chaque extraction mis en forme (getline, >>) comme condition, puisque le résultat est convertible en testable quelque chose, et la condition sera false si l'opération a échoué. Par conséquent, vous ne devez jamais interpréter les variables bénéficiaires à moins que l'opération censément réussi!

Si vous aviez ajouté ce chèque à votre code x >> h >> w;, vous aurait jamais fait passé cette ligne sans défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top