Recherche de chaînes dans une chaîne en C ++
-
28-10-2019 - |
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?
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 if
s 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.