Que signifie l'expression std::string::nposdans l'extrait de code suivant?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Réponses:
Cela signifie introuvable.
Il est généralement défini comme suit:
static const size_t npos = -1;
Il vaut mieux comparer à npos au lieu de -1 car le code est plus lisible.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;et pos:4294967295 npos: 4294967295je reçois quand je l'exécute sous Windows mais sur Mac je reçois pos:4294967295 npos: 18446744073709551615. Cela ne semble pas correct ... en tout cas je suggère de comparer au -1lieu destd::string::npos
string::nposest une constante représentant (probablement -1) une non-position. Il est retourné par méthode findlorsque le modèle n'a pas été trouvé.
Le document pour string::nposdit:
npos est une valeur de constante de membre statique avec la plus grande valeur possible pour un élément de type size_t.
En tant que valeur de retour, elle est généralement utilisée pour indiquer un échec.
Cette constante est en fait définie avec une valeur de -1 (pour tout trait), qui, étant donné que size_t est un type intégral non signé, devient la plus grande valeur représentable possible pour ce type.
size_test une variable non signée, donc 'unsigned value = - 1' en fait automatiquement la plus grande valeur possible pour size_t: 18446744073709551615
std::string::nposest un index défini par l'implémentation qui est toujours hors des limites de toute std::stringinstance. Diverses std::stringfonctions le renvoient ou l'acceptent pour signaler au-delà de la situation de fin de chaîne. Il est généralement d'un type entier non signé et sa valeur est généralement std::numeric_limits<std::string::size_type>::max ()ce qui est (grâce aux promotions d'entiers standard) généralement comparable à -1.
nous devons utiliser string::size_typepour le type de retour de la fonction find, sinon la comparaison avec string::npospourrait ne pas fonctionner.
size_type, qui est défini par l'allocateur de la chaîne, doit être de unsigned
type intégral. L'allocateur par défaut, allocator, utilise le type size_tcomme size_type. Comme il -1est converti en un type intégral non signé, npos est la valeur non signée maximale de son type. Cependant, la valeur exacte dépend de la définition exacte du type size_type. Malheureusement, ces valeurs maximales diffèrent. En fait, (unsigned long)-1diffère de (unsigned short)-1 si la taille des types diffère. Ainsi, la comparaison
idx == std::string::npos
peut donner false si idx a la valeur -1et idx et string::nposa des types différents:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Une façon d'éviter cette erreur est de vérifier si la recherche échoue directement:
if (s.find("hi") == std::string::npos) {
...
}
Cependant, vous avez souvent besoin de l'index de la position du caractère correspondant. Ainsi, une autre solution simple consiste à définir votre propre valeur signée pour npos:
const int NPOS = -1;
Maintenant, la comparaison semble un peu différente et encore plus pratique:
if (idx == NPOS) { // works almost always
...
}
npos est juste une valeur de jeton qui vous indique que find () n'a rien trouvé (probablement -1 ou quelque chose comme ça). find () vérifie la première occurrence du paramètre et renvoie l'index auquel le paramètre commence. Par exemple,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
statique const size_t npos = -1;
Valeur maximale de size_t
npos est une valeur de constante de membre statique avec la plus grande valeur possible pour un élément de type size_t.
Cette valeur, lorsqu'elle est utilisée comme valeur pour un paramètre len (ou sublen) dans les fonctions membres d'une chaîne, signifie «jusqu'à la fin de la chaîne».
En tant que valeur de retour, elle est généralement utilisée pour indiquer aucune correspondance.
Cette constante est définie avec une valeur de -1, ce qui étant donné que size_t est un type intégral non signé, il s'agit de la plus grande valeur représentable possible pour ce type.
Une réponse pour ces jours de C ++ 17, quand on a std::optional:
Si vous plissez un peu les yeux et que vous faites semblant de std::string::find()retourner un std::optional<std::string::size_type>(ce qui devrait en quelque sorte ...) - alors la condition devient:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
La valeur de string :: npos est 18446744073709551615. C'est une valeur renvoyée si aucune chaîne n'est trouvée.
18446744073709551615serait typique pour 64 bits std::size_t, il s'agit d'une valeur non signée maximale de 64 bits.