Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Demander plusieurs mots à l'utilisateur

Ex: scanf pour Nom+Prenom

Sujet résolu
2 décembre 2005 à 21:25:25

Voilà, je suis débutant, j'ai découvert les variables de chaines et j'ai vu sur un topic (je sais plus lequel) qu'on pouvait faire entrer plusieurs variables à l'utilisateur en indiquand à C le séparateur, j'ai fait un petit code:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char nom [] = {0}, prenom [] = {0}; // Déclaration des variables nom et prenom

  printf("Comment vous appellez vous?\n");
  scanf("%s %s", &nom, &prenom); // On demande d'entrer son nom et son prénom sous la forme "Nom Prenom"
 
  printf("Votre nom est %s!\n", nom); // On renvoie le nom entré dans "nom"
  printf("Et votre prenom est %s!\n", prenom); // et le prénom entré dans "prenom"
 
  system("PAUSE");
  return 0;
}

Ici l'utilisateur est sensé entrer comme chaine: "Nom Prenom", et je veux découper la chaîne pour entrer la première partie dans nom et la deuxième dans prenom...Or voici ce que donne ce code quand compilé et lancé dans la console:

Comment vous appellez vous?
Huet Guillaume
Votre nom est uillaume!
Et votre prenom est Guillaume!
Appuyez sur une touche pour continuer...


Ce qui n'est pas vraiment l'effet escompté... ^^
Alors si quelqu'un voit l'erreur que j'ai faite, merci de me renseigner sur la raison du problème...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 décembre 2005 à 21:30:48

Oublie scanf, utilise un getchar + une boucle for (à l'ancienne) et une fonction qui sépare automatiquement les deux noms quand il rencontre un espace.

Le C, c'est pour ça que c'est drôle.
  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2005 à 23:31:51

Tu n'as pas alloué de mémoire pour ranger ton nom et ton prenom. C'est mal.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 7:13:09

Citation : Bigloo

Oublie scanf, utilise un getchar + une boucle for (à l'ancienne) et une fonction qui sépare automatiquement les deux noms quand il rencontre un espace.

Le C, c'est pour ça que c'est drôle.


getchar pour la saisie de chaine c'est inefficace.
Bon et ensuite, scanf consièdre qu'une entrée est terminée quand il recontre un espace ou un retour (entrée.
Donc essaye ca
scanf("%s",Nom);
scanf("%s",prenom);
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 9:06:02

Salut,
bon, je suis nouveau aussi et j'ai pas compris certain truc dans ton code, mais j'y reviendrais.

J'ai essayé ce code :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char nom = 0, prenom = 1; // Déclaration des variables nom et prenom

  printf("Quel est votre nom?\n");
  scanf("%s",&nom);
 
  printf("Quel est votre prenom?\n");
  scanf("%s",&prenom); // On demande d'entrer son nom et son prénom sous la forme "Nom Prenom"
 
  printf("Votre nom est %s!\n", nom); // On renvoie le nom entré dans "nom"
  printf("Et votre prenom est %s!\n", prenom); // et le prénom entré dans "prenom"
 
  system("PAUSE");
  return 0;
}


Et bien ca me donne une ereur Windows ! o_O
Quand j'arrive au "Quel est votre prenom", paf, ereur, et ceci à chaque fois.


Sinon, pour demander à l'utilisateur de décliner son nom et son prenom avec un "%s".

Watzat "%s" ? C'est pour recuperer des lettres ?


Mais à ce moment là, si on recupère des lettres, pourquoi on déclare nos variables de type char ? On ne veut pas stoquer de nombres.

Et enfin, dans le cours, il y a :

char nom = 0;


Et toi tu mets :

char nom [] = {0};


A quoi sert les [] et le fait d'entourer le zér0 par des crochets ?


  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 10:59:11

Vous n'avez pas reservé de mémoire pour mettre vos chaines. C'est mal.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 11:06:33

Citation : Mackila

Vous n'avez pas reservé de mémoire pour mettre vos chaines. C'est mal.



Lui :

char nom [] = {0}, prenom [] = {0};



Moi :

char nom = 0, prenom = 1;


C'est pas ça ?
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 11:12:16

non, ce serais plutot ça:

char *prenom = malloc(sizeof(char) * 30);
fgets (prenom, 29, stdin);
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 décembre 2005 à 11:39:52

Citation : asmanur

Citation : Bigloo

Oublie scanf, utilise un getchar + une boucle for (à l'ancienne) et une fonction qui sépare automatiquement les deux noms quand il rencontre un espace.

Le C, c'est pour ça que c'est drôle.


getchar pour la saisie de chaine c'est inefficace.
Bon et ensuite, scanf consièdre qu'une entrée est terminée quand il recontre un espace ou un retour (entrée.



getchar c'est parfaitement efficace, c'est la base.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 11:59:37

Citation : drexil

non, ce serais plutot ça:

char *prenom = malloc(sizeof(char) * 30);
fgets (prenom, 29, stdin);


On a le droit de donner un nom à une variable commençant par une étoile ?

Sinon, c'est quoi ça ?
malloc(sizeof(char) * 30);


et ça ? Un getchar ?
fgets (prenom, 29, stdin);


Ca me fait penser à une boucle for en PHP, initialisation/condition/incrémentation.
Sauf que là c'est nomDeVarible/valeurDeVariable/jeSaisPasQuoi.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 12:06:34

Si j'ai bien compris le principe des char, il permet de stocker un caractère, il faut donc transformer le char en tableau pour en stocker plusieurs, c'est de là que vient mon char [], et c'est aussi la raison pour laquelle ton programme plante au moment de stoker ta variable...
Quand à la "réservation de mémoire" je ne vois pas ce que tu veux dire...Il faudrais donner un nombre au tableau? Parceque si c'est de ça que tu parles si on entre un prénom trop grand (plus grand que le tableau-1) il risque de planter non?
Et le code de drexil j'avoue ne rien avoir compris...

Quand à asmanur j'ai essayé ce que tu m'as dit, effectivement il me prend l'espace comme une fin de chaine (ce que je viens de découvrire) mais par contre le bug se produisant reste le même qu'avec mon code à moi que je fasse "Entrée" ou "espace"...Il me met bien le prénom dans prenom mais il me met le prénom tronqué d'une lettre dans nom...
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 12:26:48

Voici une petite correction de ton code :

#include <stdio.h>  /* printf(), scanf() */
#include <stdlib.h> /* system() */

int main( void )
{
    char nom[20] = { 0 },    /* tableau de 20 caractères pour le nom */
         prenom[20] = { 0 }; /* de même pour le prénom */

    printf( "Comment vous appellez vous ?\n" );
    scanf( "%19s %19s", nom, prenom ); /* le nom de tableau représentant l'adresse de son premier élément pas besoin d'utiliser l'opérateur d'adressage & */
 
    printf( "Votre nom est %s !\n", nom );
    printf( "Et votre prenom est %s !\n", prenom );
 
    system( "PAUSE" );
    return 0;
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 décembre 2005 à 12:32:56

Aie aie aie.

La gestion des chaînes de caractère en C est sans doute le plus compliqué : en effet, vous savez utiliser des variables comme des int ou des long, qui ne prennent qu'un espace mémoire prévisible. Par exemple, si on se représente la mémoire de l'ordinateur comme un tableau, on sait que les int prennent 4 cases de ce tableau, pas une de plus ni une de moins. Par contre, les chaînes de caractères peuvent être tout autant "le chat" que "le chat miaule". Et chaque caractère, chaque lettre ou signe prend une case mémoire.

Donc il faut faire ce qu'on appelle une "allocation" de mémoire : c'est dire à son programme "Tiens, je vais avoir besoin de tant d'espace en mémoire, donne les moi". Le programme, quand il lit ça, court demander de la mémoire au système (parce que c'est lui qui gère tout ça).

Ca se fait avec la fonction malloc, qui n'est pas simple à utiliser, surtout parce qu'elle demande des concepts compliqués.

Pour commencer, nous allons faire (mais retenez que c'est mal) simplement : vous pourrez réserver de la mémoire pour vos chaînes de caractères en faisant :

char maVariable[150];
int i; // Cette variable sert à compter dans la boucle for

puis en faisant ceci :

for(i = 0; i < 150; i++)
maVariable[i] = 0;

ce qui rempli la chaîne d'un caractère spécial (vous verrez pourquoi au fur et à mesure, là je détaille pas).

Après cela, vous pouvez faire

fgets (maVariable, 149, stdin);

qui va récuperer 149 caractères MAXIMUM depuis l'entrée standard (ce que vous tapez au clavier quoi) nommée stdin. La fonction les range bien sûr dans maVariable en partant du début.

C'est surement compliqué à saisir, mais à mon avis vous vous en préoccupez trop tôt. Si j'ai pas été clair je veux bien rééxpliquer certains passages.

Le mieux que vous puissiez faire est de vous entraîner à coder, maintenant.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 12:49:34

Merci Sendo, ton code marche, même si apparemment il ne respecte pas ce que dit Bigloo mais je pense que ce sera précisé dans un prochain cour de M@téo...
Sinon j'ai pas vraiment tout compris à ton explication mais j'ai suivi le principe de l'indexation des adresses mémoires...

Merci à vous pour vos explications... ;)
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 12:58:11

si, le code de Sendo respecte ce que vient de dire Bigloo, puisque, ici, il a dès de début alouer un tableau de carractaires (chaine), mais cette chaine a une longeur fixe, et ici, si tu entre plus de 19 carractaires, la chaine de texte que tu aura entrée sera tronquer, la variable ne stoquera que les 19 1er carractaire.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 décembre 2005 à 13:32:37

Vous me dites ce que vous avez pas compris et je prends mes crayons pour vous faire un schéma si ça vous aide.

(Et quand vous allez voir mes talents de dessinateur vous regretterez qu'un texte soit pas suffisant).
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 13:36:54

Je pense que Bigloo a raison, en C je ne crois pas qu'on puisse initialiser directement un tableau avec {}, c'est reserve au c++.
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 13:58:24

Citation : Bigloo

Vous me dites ce que vous avez pas compris et je prends mes crayons pour vous faire un schéma si ça vous aide.

(Et quand vous allez voir mes talents de dessinateur vous regretterez qu'un texte soit pas suffisant).



Je ne suis pas contre un ptit schema ... :-°

Et le code de Sendo n'accepte pas les nom à particule. Comment on rectifie ça ?
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 14:28:44

ces ligne ne marche pas:

char nom[20] = { 0 }, /* tableau de 20 caractères pour le nom */
prenom[20] = { 0 }; /* de même pour le prénom */

je vois pas le prob!sinon j'ai mis le ";" a la ligne d'avant
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 15:01:36

Essai de compiler avec le rajout que tu as fait et tu verras que l'IED te dit que tu n'as pas donner le type (char, long, double ...) de ta variable.

En faite c'est soit :

char nom[20] = { 0 },
         prenom[20] = { 0 };


Soit :

char nom[20] = { 0 };
char prenom[20] = { 0 };
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 15:15:02

voilà ce qui est marqué:

ps:ca marche po

conflicting type for 'nom'
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 décembre 2005 à 15:25:53

En C il est parfaitement autorisé d'initialiser un tableau avec les { } mais je ne pense pas que ça soit utile.

Droona> On y songe, alors (là je suis un peu occupé). Mais je garantis pas que ça soit mieux ;)
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 16:08:44

oui mais ya 1 bug!!!marche pas!
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 16:11:44

Il marche pour moi. Tu as copier coller ce qu'il a marqué ?
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 16:28:31

nan juste pour réinitialiser 2 variable!
  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2005 à 18:12:22

...Et bien copie/colle tout le code, ton erreur doit venir d'ailleurs car chez moi tout comme chez tout les monde apparemment il marche...

En tout cas je ne pensais pas que mon petit problème amènerait tant de discussion ^^ ...
  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2017 à 8:43:49

J'ai besoin d'un programme qui permet a un utilisateur d'entrer son prénom et de lui renvoyé les deux premiers lettres de son prénom
  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2017 à 8:46:43

Douze ans !!!!!!!!!!!!!!!!!! Un déterrage de douze ans !!!!!!!!!!!!!!!!!!! Si ça continue, le forum va être envahi de fantômes...

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2017 à 9:56:52

@Rodrigue  Bonjour, merci de ne pas déterrer d'ancien sujet, créer le votre en fournissant à la communauté votre code en utilisant le bouton </>.

Je ferme.

  • Partager sur Facebook
  • Partager sur Twitter