La fonction Nous pouvons donc écrire le code suivant sans aucun casting: p> Quel est l'avantage de retourner EDIT: strong> Comme mon code est en C ++, je vais utiliser Cependant, le La réponse de Mike Seymour convient mieux à la question. J'ai même ajouté une réponse plus détaillée ci-dessous pour dire clairement comme Char * Strrchr (const Char * Str, int ch) code>
renvoie un pointeur ( char * code>) dans
STR code> (
const char * code>) où la dernière occurrence de
ch code> est situé.
* code> au lieu de
const char * code>? p>
Comme un Shafik Yaghmour a souligné, il y a de très bonnes réponses à Comment fonctionne la mise en œuvre Strchr? p>
< string.h> code>. Merci pour vos réponses; -) p>
strrchr () code> est une Fonction (surcharge non autorisée), la déclaration correspond à la fois const em> et cordes non-const em>. Parce que
strrchr () code> peut être appelé avec une chaîne non-const em>, la chaîne renvoyée doit également être non-const em>. P> < / p>
5 Réponses :
retour const char * str code> signifie
strrchr code> ne garantit pas de modifier
str code>. P>
const char * code> signifie
strrchr code> interdit de modifier la valeur renvoyée. P>
Je suis d'accord avec toi. Mais pourquoi strrchr () code> retourne
char * code>? Pourquoi pas
const char * code>?
Sa réponse vous a dit que @olibre. Lisez-le à nouveau.
@crush pas vraiment. Comme le démontre l'OP, ce type de retour est dangereux. Notez que la version C ++ a les bonnes surcharges.
Ok je viens de comprendre tout en écrivant ce commentaire ... donc la réponse est la suivante: strrchr () code> ne veut pas modifier le contenu du pointeur retourné pointant sur la chaîne contectrice transmise sous forme de paramètre car B> La chaîne transmise peut être non constituée. Je suis correct?
@Olibre c'est ce que je veux dire. Surtout quand y compris un en-tête C.
Vous envisagez la fonction héritée de la bibliothèque standard C (
const code> et non-
, vous devez donc l'utiliser dans la mesure du possible. P> const code> surcharge
L'annexe D.5P2 indique que "chaque en-tête C, chacun ayant un nom de nom de formulaire.h, se comporte comme si chaque nom placé dans l'espace de noms de la bibliothèque standard par l'en-tête CName correspondant est placé dans la portée des espaces de noms globaux. .. . "La surcharge mentionnée doit donc être dans Sting.h aussi, et aucune raison d'utiliser la version C pour cette raison seulement.
@Balogpal vous confondez "Nom" et "Déclaration". Le nom nom i> strrchr code> est placé dans l'espace de noms global par
std code> par < Code>
strrchr code>.
strrchr code>.
@andrew: Vous dites donc, y compris
Pourquoi voudriez-vous interdire au code de modifier une variable renvoyée? L'esprit que const char * code> n'est pas
char * cons code>, vous seriez autorisé à modifier le caractère dans tous les cas, mais vous n'aurez pas de contrôle sur la valeur renvoyée elle-même, Ce qui n'a pas beaucoup de sens puisque vous pouvez vouloir le changer et éditer la chaîne sous-jacente dans une position différente de votre objectif. P>
Je ne comprends pas vraiment ce que tu veux dire. Où est votre Char * Const code>? Est-ce à propos de
constStr code>? Je pense que
const Char Constr [] = "x" code> est comme
const char * consonstr = "x" code> sauf pour
Tailleof (Constron) code>.
en C, la fonction doit être soit comme celle-ci, soit forcer l'utilisateur à utiliser des moulages dotés dans de nombreuses situations:
const code> chaîne; li>
- S'il est renvoyé un pointeur
Const code>, vous ne pouvez pas l'utiliser pour modifier une chaîne de Const code> Const CODE>. LI>
ul> en C ++, vous devez inclure code> plutôt que l'en-tête C-C-seulement. Cela vous donnera deux surcharges de const-bonnes, ce qui ne pouvait pas être fait en C: p> xxx pré> p>
J'ai accepté votre réponse, mais j'ai fourni un plus détaillé. Acclamations
mauvaise utilisation également sans erreur de compilation: p> strrchr () code> de
est une fonction C. Comme c ne permet pas la surcharge de fonction,
strrchr () code> a été conçu pour concevoir à la fois const fort> et
strrchr () code> peut être appelé avec une chaîne
en C ++, il y a deux fonctions surchargées : H2>
#include <cstring>
int main()
{
const char CONSTSTR[] = "foo/bar/foobar.txt";
char *nonconst = std::strrchr (CONSTSTR, '/');
// Visual C++ v10 (2010)
// error C2440: 'initializing' : cannot convert from 'const char *' to 'char *'
*nonconst++ = 'B';
*nonconst++ = 'A';
*nonconst++ = 'D';
}
Remarque, comme vous avez ce marquage
c ++ code> et non
c code>, vous devez vraiment utiliser
cstring code>, plutôt que
string.h code >. pédant>
Cette réponse est plutôt bonne: Stackoverflow.com/a/14368141/1708801
duplicaté possible de Comment fonctionne la mise en œuvre Strchr
@Bobtfish: Pourquoi voudriez-vous infester votre programme avec STD :: Prefix Sois? Autorisez-vous la réutilisation des noms apparaissant dans String.h en-tête à un but? Je ne le fais sûrement pas. Donc, ils vont bien dans le monde où string.h les met.
@Balogpal: Comme vous le verrez de la ou des réponses ci-dessous, c'est en fait la clé de la résolution de cet énigme.
@Balogpal sauf, les en-têtes de style C ne font pas partie de la norme C ++. Et ils ne sont pas garantis de contenir les surcharges spécifiques C ++.
@Bobtfish: En réalité, la distinction n'est pas purement pédante ici. code> fournit les surcharges de const-bonnes impossibles à fournir en C.
@Angew: la norme C ++ inclut la norme C par référence afin de pouvoir en fait partie. En ce qui concerne les différences C vs. C ++, mon interprétation était que celles s'appliquent aux deux formes, et ne diffèrent que dans les noms obligatoires de la note de bas de page 177 en C ++ 11. Mais cela va mériter de demander.
@Olicharlesworth: Je vois mais n'est pas correct. Malgré la tonne des votes.