chaîne de caractères.find() ne retourne pas les -1
Le code ci-dessous est très simple. Que je sache, si string::find() n'a pas trouvé matches elle retourne -1. Mais pour certaines raisons, le code ci-dessous ne fonctionne pas. Chaque fois que j'exécute ce code j'obtiens boucle sans fin. Merci pour l'aide!
#include <string>
#include <iostream>
using namespace std;
int main()
{
string text;
text = "asdasd ijk asdasd";
string toReplace = "ijk";
cout<<text<<endl;
int counter = 0;
while ( text.find(toReplace) != -1)
counter++;
cout<<counter<<endl;
system("pause");
}
- Il me semble certain temps passé à lire la documentation de std::basic_string::find() serait susceptible de faire des merveilles dans l'apprentissage du fonctionnement de quelque chose.
- Mise à JOUR: j'ai essayé d'utiliser tout ( le texte.trouver(toReplace) != string::obnl ) mais j'ai toujours boucle sans fin 🙁
- Avez-vous essayez de faire quelque chose dans ce tout-corps en plus d'incrémenter un compteur de sens? C'est là la première case, le temps à lui seul n'est pas pour le faire aucune faveur. Peut-être changer d'endroit où vous commencez à la recherche après chaque touche réussie.
Vous devez vous connecter pour publier un commentaire.
Côté de l'autre les réponses qui sont tout à fait correct, je voulais juste ajouter que votre boucle while aurait produit une boucle sans fin de toute façon. Par exemple:
sera une boucle sans fin, car il va continuer à essayer de trouver le
toReplace
chaîne danstext
et il sera toujours le trouver (c'est parce que trouver commence à partir du début de la chaîne à chaque fois). Ce n'est probablement pas ce que vous souhaitiez.std::string::find
retournestd::string::npos
si la recherche de sous-chaîne n'est pas trouvée, pas-1
. La valeur exacte denpos
la mise en œuvre est définie, afin de l'utilisernpos
, comme dansVenez pour penser à elle,
find
ne pouvait pas retourner -1 même si elle le voulait, parce que le type de retour de la trouver est destd::size_t
qui est un unsigned type.En outre, les trouver va toujours de recherche pour le première occurrence de la sous-chaîne, peu importe combien de fois vous l'appelez. Si vous souhaitez parcourir toutes les occurrences que vous devez utiliser la surcharge de
find
qui prend un deuxième paramètre de la position à partir de laquelle commencer la recherche.npos
est-1
(converti ensize_type
).-1
est sans doute moins élégant, mais pas incorrect.size_type
résultat defind
avec-1
donnera toujours le même résultat que la comparaison avecnpos
.Celui qui vous a dit ceci ou partout où vous le lisez, il a menti à vous.
Si
std::string::find
échoue, elle renvoiestd::string::npos
, ce qui n'est pas-1
.Vous devez vérifier la documentation au sujet de telles choses, quand vous n'êtes pas sûr.
Donc, votre
while
sera quelque chose comme:Ce qui concerne votre commentaire:
Vous devriez vraiment apprendre à lire l' la documentation. Utiliser une variable pour stocker le dernier résultat de
std::string::find
(différent destd::string::npos
) et l'utilisationstd::string::find
deuxième paramètre -pos
( en passant la valeurlast_match_position + 1
).L'omission de la deuxième paramètre,
std::string::find
commence toujours à partir du début de la chaîne, ce qui entraîne la boucle sans fin.Dans l'extrait de code que vous avez fourni
text
variable contient la sous-chaîne "ijk" qui est stocké dans letoReplace
variable. Aussi longtemps que dans tout le cycle nitext
outoReplace
variables sont modifiées, trouver la méthode retournera toujours pas une valeur de -1 qui est la condition de tout le cycle de continuer.Comme déjà dessus décrite dans d'autres commentaires, vous devriez vérifier pas de -1, mais pour
std::string::npos
.Il ne permet de lire la page de manuel (string::obnl est la réponse).
Voir http://www.cplusplus.com/reference/string/string/find/