Retour de pointeur

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour :) ,

je ne comprend pas vraiment pourquoi le code suivant (commenté avec ce que j’espérais qu'il fasse) ne fonctionne pas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>

char charAnswer(char text[500]) // on donne un texte à la fonction
{
    char entered[200];

    entered[0] = '\0'; // on initialise la chaine de caractère à vide (signe de la fin de la chaine au début)

    while (entered[0] == '\0') { // tant que la chaine est vide...
        printf("%s", text); // on affiche le texte donné à la fonction
        scanf("%s", &entered); // on demande d'entrer une réponse
    }

    return &entered; //on retourne un pointeur qui pointe sur la chaine entrée par l'utilisateur
}

int main()
{
    printf("%s", *charAnswer("Name: ")); // on appelle la fonction charAnswer, et on affiche ce que contient la variable pointé par le pointeur retourné par la fonction charAnswer

    return 0;
}

J'ai ces erreurs:

Fonction Ligne Type Message
charAnswer 12 Warning format '%s' expects argument of type 'char ', but argument 2 has type 'char ()[200]' [-Wformat]
charAnswer 15 Warning return makes integer from pointer without a cast [enabled by default]
charAnswer 15 Warning function returns address of local variable [enabled by default]
main 20 Error invalid type argument of unary '*' (have 'int')

J'ai l'impression que le warning ligne 15 qui indique que le pointeur est un int est la cause du problème, mais je ne sais pas comment le résoudre. J'ai essayé de cast, d'utiliser une variable comme pointeur et plein d'autres choses (même si je ne comprend pas pourquoi je les ai fait, ces choses) mais rien n'y fait.

Merci !

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -0
Staff

Tout d'abord, pas besoin de & dans scanf, car un char[] est implicitement converti en un char* (si je dis pas de bêtise, j'ai un peu oublié).

Ensuite, ta fonction déclare qu'elle renvoie un char, mais toi tu cherches à renvoyer un pointeur sur un tableau de char, d'où le deuxième warning.

Concernant le troisième warning, tu retourne l'adresse d'un objet local qui sera détruit lorsque la fonction sera finie ; autrement dit, quand on sort de cette fonction, alors l'adresse est invalide et pointe sur n'importe quoi en mémoire.

Enfin, %s sert à afficher des chaînes de caractères, mais toi, comme ta fonction retourne un char et que celui-ci est converti en int, tu tente de déréférencer un int, d'où l'erreur.

Auteur du sujet

Merci! Tout semble clair d'un coup, sauf que je n'arrive pas à résoudre le problème de int, je ne comprend pas d'où viens ce fameux int.

J'ai modifié le bout de code comme ceci (ma fonction à un autre argument: un pointeur vers l'array à modifier, et donc la fonction ne renvoie rien) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>

void charAnswer(char text[500], char *pointer)
{
    char entered[200];

    entered[0] = '\0';

    while (entered[0] == '\0') {
        printf("%s", text);
        scanf("%s", entered);
    }

    *pointer = entered;
}

int main()
{
  char name[200] = "";
  charAnswer("Name: ", &name[200]);
    printf("%s", name);

    return 0;
}

Je peux exécuter le programme, mais name semble vide. Erreur:

Fonction Ligne Type Message
charAnswer 15 warning assignment makes integer from pointer without a cast [enabled by default]

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -0
Staff

Tu mélange pointeurs et variables. Et ton pointeur pointer de ta fonction charAnswer ne change rien puisque tu tente (il faut enlever * d'ailleurs) de lui affecter une adresse qui deviendra invalide à la fin de la fonction.

De plus, ton &name[200] ne fait pas ce que tu crois : là tu lui passe l'adresse du 200ème élément de ta chaîne name, alors que le dernier indice valide est le 199. Autrement dit, tu lui passe l'adresse d'un truc invalide. Je suis étonné que ton programme ne plante pas.

Si tu veux réviser un peu tes notions de pointeurs, de tableaux et de chaînes de caractères, n'hésite pas à lire ce tutoriel.

EDIT : et concernant cette histoire de char transformé en int, c'est parce qu'en C, les caractères sont de type int. En C, char est un terme trompeur. Il devrait plutôt s'appeler int8_t.

Édité par informaticienzero

Oups ! Tu va avoir des problèmes toi. Modifier une chaine litérale, y-en a qui ont essayé, ils ont eu des problèmes.

"Name :" que tu passes à ta fonction est une chaine litérale, c'est à dire qu'elle s'assimile à une chaine constance. Ici tu n'as presque pas besoin des pointeurs (pas besoin explicitement).

Tu n'as pas besoin de tableau dans ta fonction car de toute façon, à la fin de la fonction, il serra détruit.

Il faut que tu passes le tableau en paramètre depuis ta fonction main. C'est le seul paramètre dont tu as besoin. Apparement, tu veux également pouvoir dire à l'utilisateur quoi entrer. Là tu dois passer une chaine de caractère litérale en plus à ta fonction. Un simple pointeur sur char constant suffit. La seul utilité de ce pointeur serrait pour ton printf.

Bonne chance pour la suite.

Édité par ache

ache.one                                                                                   🦊

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte