113 votes

Que signifie string::npos dans ce code?

Que signifie la phrase std::string::npos dans le morceau de code suivant ?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "première occurrence de 'needle' trouvée à : " << int(found) << std::endl;

121voto

Brian R. Bondy Points 141769

Cela signifie non trouvé.

Il est généralement défini comme suit :

static const size_t npos = -1;

Il est préférable de comparer à npos au lieu de -1 car le code est plus lisible.

3 votes

Comparer == -1 pourrait aussi faire penser à certains qu'ils peuvent le convertir en < 0, ce qui N'EST PAS la même chose et ne fonctionnera pas.

0 votes

Juste demander si quelqu'un a rencontré ceci, ou si c'est juste moi... Je cours cout<<"pos: "< et obtiens `pos:4294967295 npos: 4294967295` quand je l'exécute sous Windows mais sur Mac j'obtiens `pos:4294967295 npos: 18446744073709551615`. Ça ne semble pas correct... eh bien de toute façon je suggère de comparer à `-1` plutôt qu'à `std::string::npos`

0 votes

@user1135469 si vous voyez la réponse de codaddict ci-dessous (stackoverflow.com/a/3827997/752842) ou de Sebastian Raschka, je pense que ce que vous obtenez aura du sens. Et je recommanderais d'utiliser npos, car j'ai essayé d'utiliser -1 et cela ne fonctionnait pas correctement dans les conditions que j'utilisais.

61voto

Sheldon L. Cooper Points 1915

string::npos est une constante (probablement -1) représentant une non-position. Elle est renvoyée par la méthode find lorsque le motif n'a pas été trouvé.

18 votes

+1 pour avoir effectivement montré la dérivation npos = no-pos qui rend facile à mémoriser. C'est tellement évident qu'on n'y penserait pas une fois qu'on le sait, mais pour quelqu'un voyant ces lettres pour la première fois, ça peut ne pas cliquer...?

6 votes

Faux sur 47 niveaux... npos est de type size_t, cela signifie qu'il ne peut pas être négatif... la vraie signification est max_index, 18446744073709551615 pour un size_t de 64 bits

26voto

codaddict Points 154968

Le document pour string::npos dit :

npos est une valeur constante 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), ce qui, car size_t est un type intégral non signé, devient la plus grande valeur représentable possible pour ce type.

21voto

Sebastian Raschka Points 1056

size_t est une variable non signée, donc 'valeur non signée = - 1' fait automatiquement de celle-ci la plus grande valeur possible pour size_t : 18446744073709551615

1 votes

Size_t est un entier non signé pour un compilateur 32 bits ; un entier non signé long long pour un compilateur 64 bits. Le définir à -1 lui donne la valeur maximale de ce type non signé.

10voto

Václav Zeman Points 7911

std::string::npos est un index défini par l'implémentation qui est toujours en dehors des limites de n'importe quelle instance de std::string. Diverses fonctions de std::string le renvoient ou l'acceptent pour signaler une situation au-delà de la fin de la chaîne. Il est généralement d'un certain type entier non signé et sa valeur est généralement std::numeric_limits::max () qui est (grâce aux promotions standard des entiers) généralement comparable à -1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X