Que signifie l'expression std::string::npos
dans 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: 4294967295
je 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 -1
lieu destd::string::npos
string::npos
est une constante représentant (probablement -1
) une non-position. Il est retourné par méthode find
lorsque le modèle n'a pas été trouvé.
Le document pour string::npos
dit:
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_t
est une variable non signée, donc 'unsigned value = - 1' en fait automatiquement la plus grande valeur possible pour size_t
: 18446744073709551615
std::string::npos
est un index défini par l'implémentation qui est toujours hors des limites de toute std::string
instance. Diverses std::string
fonctions 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_type
pour le type de retour de la fonction find, sinon la comparaison avec string::npos
pourrait 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_t
comme size_type
. Comme il -1
est 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)-1
diffè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 -1
et idx et string::npos
a 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.
18446744073709551615
serait typique pour 64 bits std::size_t
, il s'agit d'une valeur non signée maximale de 64 bits.