Ne peut pas convertir const char * char *
Visual Studio c++ 2005
J'obtiens une erreur sur la dernière ligne de ce code.
int Utils::GetLengthDiff ( const char * input, int & num_subst )
{
int num_wide = 0, diff = 0 ;
const char * start_ptr = input ;
num_subst = 0 ;
while ( ( start_ptr = strstr ( start_ptr, enc_start ) ) != NULL )
{
char * end_ptr = strstr ( start_ptr, enc_end ); //Error
J'ai donc modifié la ligne en fait, et cela a fonctionné
const char * end_ptr = strstr ( start_ptr, enc_end );
Alors pourquoi aurais-je besoin de le déclarer end_ptr comme const?
Merci beaucoup,
OriginalL'auteur ant2009 | 2010-03-09
Vous devez vous connecter pour publier un commentaire.
C++ a deux versions surchargées de cette fonction. http://www.cplusplus.com/reference/clibrary/cstring/strstr/
Depuis votre
start_ptr
estconst char *
le compilateur C++ décide d'appeler la version qui prend unconst char *
comme premier paramètre, cette version aussi retourne unconst char *
, vous devez donc modifier votre valeur de retour de match.OriginalL'auteur John Knoeller
Pour la même raison que
start_ptr
doit êtreconst char*
:strstr
retourne le typeconst char*
(=char const*
) parce qu'il recherche à l'intérieur d'une constante chaîne de caractères (le paramètre que vous passer àstrstr
est égalementconst char*
). En particulier, il est pas le pointeur qui estconst
, c'est la mémoire qu'il points de. Pensez-y comme un pointeur vers un immuable (c'est à dire constante) de la chaîne. Vous peut changer ce qu'il désigne, mais pas les caractères individuels à l'intérieur de la chaîne.C'est différent d'un immuable pointeur qui pointe vers une mutable chaîne, c'est à dire une chaîne de caractères où vous pouvez modifier les caractères individuels.
OriginalL'auteur Konrad Rudolph
Supposons que la valeur de retour de
strstr
ont étéchar*
, avec unconst char*
premier paramètre, car il est en C. Ensuite, vous pouvez écrire:Le code à compiler et exécuter (avec un comportement indéfini), mais c'est le genre d'erreur qui
const
a été spécialement conçu pour éviter. Vous avez converti unconst char*
àchar*
sans un plâtre.C ne peuvent pas vraiment faire quoi que ce soit: si strstr retourné
const char*
vous devrez alors les acteurs non-const explicitement dans le cas où l'entrée est non-const et que vous souhaitez modifier la chaîne. Parce que le C++ a une surcharge de fonctions, il peut (et ne doit) fiche de la faille et de faire les deux cas, le travail correctement. Donc, en C++, le code ci-dessus ne peut pas compiler, et le fait de votre code d'exemple.OriginalL'auteur Steve Jessop