Je viens juste de commencer c ++ et j'ai du mal à comprendre const char*
. J'essaie de convertir l'entrée de la méthode en string
, puis de modifier les chaînes pour ajouter des traits d'union lorsque je le souhaite, puis de récupérer cette chaîne et de la reconvertir en char*
. Jusqu'ici, lorsque j'essaie, cela me donne une erreur de bus 10.
char* getHyphen(const char* input){
string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"};
//convert char* to string
string a;
int i = 0;
while(input != '\0'){
a += input[i];
input++;
i++;
}
//convert a string to char*
return NULL;
}
R: La classe std::string
a un constructeur qui prend un char const*
. Vous créez donc simplement une instance pour effectuer votre conversion.
B: Les instances de std::string
ont une fonction membre c_str()
qui renvoie un char const*
que vous pouvez utiliser pour reconvertir en char const*
.
auto my_cstr = "Hello"; // A
std::string s(my_cstr); // A
// ... modify 's' ...
auto back_to_cstr = s.c_str(); // B
Tout d'abord, vous n'avez pas besoin de tout ce code pour construire un std::string
à partir de l'entrée. Vous pouvez simplement utiliser:
string a(input);
En ce qui concerne le retour d'un nouveau char*
, vous pouvez utiliser:
return strdup(a.c_str()); // strdup is a non-standard function but it
// can be easily implemented if necessary.
Assurez-vous de désallouer la valeur renvoyée.
Il sera préférable de simplement renvoyer un std::string
afin que les utilisateurs de votre fonction n'aient pas à s'inquiéter de l'allocation/désallocation de mémoire.
std::string getHyphen(const char* input){
N'utilisez pas char*
. Utilisez std::string
, comme tous les autres ici vous le disent. Cela éliminera tous ces problèmes.
Cependant, dans un souci d'exhaustivité et parce que vous souhaitez comprendre le contexte, analysons ce qui se passe.
while(input != '\0'){
Vous voulez probablement dire:
while(*input != '\0') {
Votre code compare le pointeur input
au \0
, c’est-à-dire qu’il recherche un pointeur nul, ce qui est dû à la conversion automatique regrettable d’un \0
char
. Si vous essayez de comparer avec, par exemple, 'x'
ou 'a'
, vous obtiendrez une erreur de compilation au lieu de plantages à l’exécution.
Vous voulez déréférencer le pointeur via *input
pour atteindre le char
pointé.
a += input[i]; input++; i++;
Cela ne fonctionnera pas non plus. Vous incrémentez le pointeur input
, mais avec [i]
vous avancez encore plus loin . Par exemple, si input
a été incrémenté trois fois, alors input[3]
sera le 7ème caractère du tableau d'origine transmis à la fonction, pas le 4ème. Cela entraîne éventuellement un comportement indéfini lorsque vous quittez les limites du tableau. Le comportement non défini peut également être le "erreur de bus 10" vous mentionnez.
Remplacer par:
a += *input;
input++;
i++;
(En fait, maintenant que i
n'est plus utilisé, vous pouvez le supprimer complètement.)
Et permettez-moi de le répéter encore une fois: n'utilisez pas char*
. Utilisez std::string
.
Changer votre déclaration de fonction de
char* getHyphen(const char* input)
à
auto hyphenated( string const& input )
-> string
et évitez tous les problèmes de conversion en char const*
et retour.
Cela dit, vous pouvez construire un std::string
à partir d'un char_const*
comme suit:
string( "Blah" )
et vous récupérez un char const*
temporaire en utilisant la méthode c_str
.
Notez que le résultat de c_str
n'est valide que tant que l'instance string
d'origine existe et n'est pas modifiée. Par exemple, appliquer c_str
à une string
locale et renvoyer ce résultat génère un comportement non défini et n'est pas une bonne idée. Si vous devez absolument renvoyer un char*
ou char const*
, allouez un tableau avec new
et copiez les données de chaîne avec strcpy
, comme ceci: return strcpy( new char[s.length()+1], s.c_str() )
, où +1
permet de gérer un octet nul final.