-2
votes

Je ne peux pas retourner une chaîne de l'entrée de l'utilisateur en fonction

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;

}


1 commentaires

Allumez les avertissements du compilateur


3 Réponses :


1
votes

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.


0 commentaires

1
votes

La variable nom est une variable locale dans la fonction userData () 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.

En outre, vous devriez allouer de la mémoire au char *.


0 commentaires

2
votes

Votre code a deux problèmes principaux:

1.

nom dans principal () est juste un pointeur.

Où voulez-vous stocker la chaîne dans?

Vous devez soit créer un nom comme une matrice de char ou Lorsque vous utilisez nom car le pointeur alloue de la mémoire de manière dynamique via une fonction de gestion de la mémoire, telle que MALLOC () où le pointeur pointe de.

2. < / h3>

Comment transmettez-vous le pointeur de principal () à l'appelant? La liste des paramètres actuelle de userData est vide, signifie que rien n'est passé.

Vous devez placer char * nom; dans userData dans la liste des paramètres: xxx

et appeler userData comme: xxx note : Ce nom (code> spécifie désormais l'identifiant du pointeur / tampon dans principal () , pas le pointeur dans userData () .Le fait que le fait que le fait que le fait que le Pointeur / tampon dans l'appelant Main () , ainsi que le pointeur dans userData () avoir le même nom est une mauvaise coïncidence de présenter l'exemple. Mais je pense que vous comprendrez comment ça fonctionne.


xxx

Notes de côté:

  • Le type de retour de userData n'a pas besoin d'être const qualifié. Cela n'a aucun effet. La fonction renvoie un pointeur sur char . Le const 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.

  • Premier, en C, il n'est pas possible de passer ou de retourner des chaînes à ou des fonctions par valeur .

    Deuxièmement, il n'y a pas de type appelé " string " dans C. Les chaînes sont stockées dans des tableaux modifiables ou non modifiables de char s.

    Ainsi, disant "retourner une chaîne" est dans deux contextes incorrects. Plutôt, vous passez ou renvoyez un référence aux tableaux contenant des chaînes à l'aide de pointeurs.

  • 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.

  • Si vous avez un compilateur approprié, n'ignorez jamais les avertissements du compilateur.


8 commentaires

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 est pointant n'est pas const . En fait, dans userData vous le modifiez en écrivant une chaîne à celle-ci. Const ne serait utile que si nom 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 . Le Const 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.