J'essaie de renvoyer une chaîne de l'entrée de l'utilisateur dans une fonction mais apparemment, cela ne fonctionne pas. J'ai reçu le nom de sortie: PE mais ce n'est pas ce que j'ai entré lors de l'utilisation de Fgets.
#include <stdio.h>
#include <stdlib.h>
const char *userData();
int main() {
char *name;
userData();
printf("\nName: %s", name);
}
const char *userData() {
char *name;
//INPUT FROM USER
//NAME
printf("\nEnter your name : ");
fgets(name, 100, stdin);
return name;
}
3 Réponses :
La valeur renvoyée par UserData n'est attribuée à rien dans votre fonction principale. Vous retournez * Nom de la fonction, mais vous n'avez pas dit à la principale que faire avec cette valeur qu'elle revient. Cette variable de nom n'est pas partagée entre les fonctions, sauf si vous le faites global, si c'est ce que vous comptez sur. P>
La variable En outre, vous devriez allouer de la mémoire au char *. P> nom code> est une variable locale dans la fonction userData () code> et sa portée est limitée à cette fonction uniquement, car les deux variables sont différentes, vous avez gagné ' t obtenir le résultat que vous attendez. p>
Votre code a deux problèmes principaux:
Où voulez-vous stocker la chaîne dans? p> Vous devez soit créer un nom Comment transmettez-vous le pointeur de Vous devez placer et appeler Notes de côté: p> Le type de retour de Premier, en C, il n'est pas possible de passer ou de retourner des chaînes à ou des fonctions par valeur em>. p>
Deuxièmement, il n'y a pas de type appelé " string em>" dans C. Les chaînes sont stockées dans des tableaux modifiables ou non modifiables de Ainsi, disant "retourner une chaîne" est dans deux contextes incorrects. Plutôt, vous passez ou renvoyez un référence em> aux tableaux contenant des chaînes à l'aide de pointeurs. P> li>
Mise à jour ou échangeez votre compilateur. Il vous aide à détecter la main en détectant des erreurs de syntaxe dans votre code. Par exemple, GCC ou SLIG est à noter. P> li>
Si vous avez un compilateur approprié, n'ignorez jamais les avertissements du compilateur. P> LI>
ul> p> nom code> dans principal () code> est juste un pointeur. p> comme une matrice de char code> ou Lorsque vous utilisez nom code> car le pointeur alloue de la mémoire de manière dynamique via une fonction de gestion de la mémoire, telle que MALLOC () code> où le pointeur pointe de. p> 2. < / h3>
principal () code> à l'appelant? La liste des paramètres actuelle de userData code> est vide, signifie que rien n'est passé. P> char * nom; code> dans userData Code> dans la liste des paramètres: p> userData code> comme: p> (code> spécifie désormais l'identifiant du pointeur / tampon dans principal () code>, pas le pointeur dans userData () code> .Le fait que le fait que le fait que le fait que le Pointeur / tampon dans l'appelant Main () Code>, ainsi que le pointeur dans userData () code> avoir le même nom est une mauvaise coïncidence de présenter l'exemple. Mais je pense que vous comprendrez comment ça fonctionne. p>
userData code> n'a pas besoin d'être const code> qualifié. Cela n'a aucun effet. La fonction renvoie un pointeur sur char code>. Le const code> NESS n'a aucun effet car il n'a aucune influence sur la question de savoir si la valeur d'adresse retournée est accessible dans l'appelant ou non. P> li>
char code> s. P>
Merci, cela m'a beaucoup aidé. Maintenant, je sais comment retourner la chaîne. C'est très difficile pour moi de comprendre les pointeurs.
@Mufamin Supprimez le libellé "String de retour" hors de votre esprit. C'est incorrect ou même mal. Vous ne revenez pas et ne passe pas des chaînes en C par valeur. Vous passez toujours ou retournerez des pointeurs sur des tampons.
bien, compris. On dirait que c'est comme ça que c fonctionne, ça passe toujours des pointeurs.
Pouvez-vous expliquer pourquoi le type de retour n'a pas besoin d'être constitué?
@Mufamin parce que la mémoire tampon Le pointeur nom code> est pointant n'est pas const code>. En fait, dans userData code> vous le modifiez en écrivant une chaîne à celle-ci. Const code> ne serait utile que si nom code> indiquerait à un tampon qui ne doit pas être modifiable après son initialisation ou une littérale de chaîne stockée dans une mémoire en lecture seule.
Mais même alors, il ne serait pas logique de qualifier le pointeur retourné avec const code>. Le Const code> anténité du pointeur retourné n'a pas d'influence sur la manière dont la valeur d'adressement retournée est accessible dans l'appelant.
@Mufamin je vous recommande de télécharger et de lire ce livre: Kremlin.cc/k&r.pdf
Ce livre est très utile. Merci beaucoup et je vais le lire et développer mes connaissances en C.
Allumez les avertissements du compilateur