Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/03/2019, à 18:04

chris7522

[ RESOLU ] Petit programme C n'affiche pas ce que je veux

bonjour a toutes et a tous ,
    Je debute en C . Je me suis éssayé a ecrire ce petit programme :

 

  1 #include <stdio.h>
  2 int main(void)
  3 {
  4  int jeuDemarre = 1;
  5  
  6  if(jeuDemarre)
  7    {
  8      printf("Afin que le jeux commence ,veuillez rentrer votre login :\n");
  9    }
 10  int login = 'A';
 11  scanf("%c", &login);
 12    printf("Votre login est : %c\n", login);
 13 
 14 
 15 return 0;
 16 }
 17 
 18 
 19 
~                                                                                               
~                                                                                               
                                                                              16,1         Tout

  Lorsque je lance le programme apres compilation , il me sort bien la phrase :
  Afin que le jeux commence ,veuillez rentrer votre login :
  Ensuite je tape mon prenom christophe
  mais ensuite , il m'ecrit : Votre login est : c  au lieu de  : Votre login est christophe .
  Il n'affiche pas la totalité de mon prenom . Savez vous pourquoi ?
Merci de votre aide !

Dernière modification par chris7522 (Le 29/03/2019, à 20:23)

Hors ligne

#2 Le 27/03/2019, à 19:09

Naziel

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Bonjour,

Tu as défini login comme un int, c'est à dire un entier. Il faudrait le définir comme une chaîne de caractères (ou tableau de caractères). Je te laisse consulter https://openclassrooms.com/fr/courses/1 … caracteres qui correspond bien à ton problème.


[ poster correctement un retour de commande ] [ poster correctement une photo ]
Nouvel adhérent FDN
thinkpad x220, Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Pour reprendre le contrôle des semences: https://kokopelli-semences.fr/fr/

Hors ligne

#3 Le 27/03/2019, à 21:09

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Merci de ton aide . J'ai lu la page et fais quelques modification notamment j'ai changé int pour char , mais rien ne change apres avoir renseigné mon prenom , seulement la premiere lettre apparait au lieu de la totalité de chaine de caractere .

  1 #include <stdio.h>
  2 int main(int argc, char *argv[])
  3 {
  4  int jeuDemarre = 1;
  5  
  6  if(jeuDemarre)
  7    {
  8      printf("Afin que le jeux commence ,veuillez rentrer votre login :\n");
  9    }
 10  char login = 0;
 11  scanf("%c", &login);
 12    printf("Votre login est : %c\n", login);
 13  
 14  
 15 return 0;
 16 }
 17 
 18 
 19 
~                                                                               
~                                                                               
-- VISUEL --                                                  16,2         Tout

Dernière modification par chris7522 (Le 27/03/2019, à 21:10)

Hors ligne

#4 Le 27/03/2019, à 21:18

Zakhar

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Eh bien oui, le programme fait ce que lui demande !
Tu demande de "scanner" %c ce qui est 1 caractère !

Pour faire ce que tu veux faire, il va falloir que tu commences à rentrer dans les complexités de ce qu'est une allocation mémoire, etc...

En effet, il va falloir stocker quelque part la chaîne que ton utilisateur va entrer pour pouvoir l'afficher.  Ensuite, pour être "propre", il faut libérer la mémoire ainsi allouée.

Oui le C c'est super puissant... mais ça demande un peu de pratique.

Regarde

man scanf

Aussi, la lecture de chaîne standard va s'arrêter au premier "espace" (ou caractère considéré comme tel).

A minima il te faut

char *p

scanf("%ms", &p);

/* do something with  p */

free(p);

Sinon tu as l'option d'un buffer fixe, en limitant la longueur attendue pour la saisie.

A toi de voir selon les fonctionnalités attendues.

P.S.: le man de scanf donne précisément un exemple de ce que tu veux faire, en y incluant la gestion propre des erreurs.

Dernière modification par Zakhar (Le 27/03/2019, à 21:25)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#5 Le 27/03/2019, à 21:24

Naziel

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

@Zakhar : Pas besoin d'un tableau de char?


[ poster correctement un retour de commande ] [ poster correctement une photo ]
Nouvel adhérent FDN
thinkpad x220, Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Pour reprendre le contrôle des semences: https://kokopelli-semences.fr/fr/

Hors ligne

#6 Le 27/03/2019, à 21:29

Zakhar

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

@Naziel: ça dépend !

2 options :
- tu laisses scanf se débrouiller avec le modificateur "magique" 'm', et il va alors faire un malloc suffisant pour contenir la chaîne scannée. Il faut ensuite faire un free du pointeur reçu.
- tu alloues toi-même, ou tu définis un tableau de longueur fixe, et tu fais alors un scanf avec le maximum du tableau.

L'un ou l'autre dépend de ce que tu as envie de faire, si tu as déjà des limites de longueur acceptable définies, le tableau est plus simple parce que pas de risque de créer des fuites mémoire !..


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#7 Le 27/03/2019, à 21:34

Naziel

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Merci Zakhar! Je ne connaissais pas ce paramètre magique smile

Dernière modification par Naziel (Le 27/03/2019, à 21:34)


[ poster correctement un retour de commande ] [ poster correctement une photo ]
Nouvel adhérent FDN
thinkpad x220, Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Pour reprendre le contrôle des semences: https://kokopelli-semences.fr/fr/

Hors ligne

#8 Le 27/03/2019, à 21:36

Zakhar

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Bien pratique... mais pas oublier le "free" pour éviter les fuites mémoire ! mad


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#9 Le 27/03/2019, à 22:17

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Merci Zakhar , je vais examiner le man en espérant en apprendre un peu plus .
Merci de votre aide , tres bonne soirée a tous

Hors ligne

#10 Le 28/03/2019, à 09:53

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

J'ai pas trouvé de solution a mon affaire . Je crois que je ne suis pas au niveau , je vais reprendre au debut ...

Hors ligne

#11 Le 28/03/2019, à 10:21

pingouinux

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Bonjour,
Après quelques tâtonnements (je ne connaissais pas le format de lecture "%ms") :

#include <stdio.h>
int main(void)
{
 int jeuDemarre = 1;
 
 if(jeuDemarre)
   {
     printf("Afin que le jeux commence ,veuillez rentrer votre login :\n");
   }
 char* login ;
 scanf("%ms", &login);
   printf("Votre login est : %s\n", login);


return 0;
}

En ligne

#12 Le 28/03/2019, à 16:59

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Dis moi pas k'c'est pas vrai , voila la bonne facon de faire ! Ca marche !
Merci pingouinux

Hors ligne

#13 Le 28/03/2019, à 19:30

Zakhar

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

C'est exactement ce que j'ai expliqué plus haut, et ce qui est marqué dans le man !

Merci Pingouinux pour l'exemple entier...

Mais plusieurs remarques :
- 1) déclarer une variable au milieu d'un bloc n'est pas compatible toutes versions de C. Il vaut donc mieux ("pedantic") remonter la déclaration de char * login juste en dessous d'une accolade ouvrante du main. Les premières versions de C d'ailleurs ne supportaient de déclaration de variables qu'en entrée de fonction. On peut donc faire ainsi si on veut "assurer".
- 2) Ce programme présente une fuite mémoire. En l'occurrence on s'en fiche un peu, parce qu'heureusement quand le main se termine, le système nettoie toute la mémoire allouée, mais, et j'ai bien insisté, l'option "magique" 'm' réalise une allocation mémoire... et c'est au programmeur de correctement libérer la mémoire lorsqu'elle ne sert plus. Sur le cas présent, la "fuite" n'est pas grave, mais si on prend ce bout de code pour en faire une fonction qu'on appelle plusieurs fois, on aura alors une vraie fuite mémoire. Comme je présente une solution plus "logique" en mettant l'initialisation du jeu en fonction, le free devient nécessaire !

- 3) Mais ça c'est une erreur initiale dans le programme en exemple, c'est contre-indiqué de faire un "cast implicite" d'un entier en booleen, c'est à dire de tester un entier tel que le fait le programme d'origine.
- 4) Styling, depuis K&R on a tendance à mettre le { ouvrant à droite du mot clé, sauf pour les fonctions. Aussi, on essaye de mettre des noms de variable simple en anglais ! C'est un must pour le libre pour que d'autres puissent améliorer.
- 5) le programme ne teste aucun code retour d'erreur... voir l'exemple du man qui fait cela.

- 6) Ca ne fait à peu près aucun sens de positionner une variable a true et tester juste après (le compilateur va de toute façon l'optimiser !). On va donc donner un peu de sens en faisant de startGame une fonction qu'on appelle avec un booléen "true/false" et qui réalise l'initialisation du jeu ou ne fait rien. On teste juste la fonction en l'appelant avec true dans le main. Aussi, dans la logique des choses, soit le flag est "true" et on affiche le message + scanf, ou on en fait rien de cela. La logique présentée dans le programme d'origine ne fait donc pas de sens, car si startGame avait été à false on aurait eu la demande de saisir quelque chose sans avoir le message préalable.

- 7) Correction des fautes de français dans les messages ! roll

- 8) Ergonomie : on s'attend à saisir le login à côté du "prompt", donc on ne met pas de \n après le message d'invite de saisie. (Question de goût et de couleur, mais c'est l'habitude)

Une possible solution "correcte" est donc par exemple :

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


void startGame(bool start)
{
	char *login;
	int n;

	if (start) {
 		printf("Afin que le jeu commence, veuillez saisir votre login : ");
		errno = 0;
		login = NULL;
		n = scanf("%ms", &login);
		if (1 == n && 0 == errno ) {
			printf("Votre login est : %s\n", login);
		}
		else {
			if (0 != errno)
        	      		perror("\nErreur scanf");
			else
				printf("\nAucun login saisi.\n");
	        }
		free(login);
	}
}

int main(void)
{
	startGame(true);
	return 0;
}

Pour tester le programme ci-dessus, vous pouvez faire par exemple :

./test </dev/null

Pour générer un message "Aucun login entré".
Pour le message d'erreur scanf... il faudrait arriver à faire planter scanf... moins facile !


Enfin @chris7522, je constate que tu n'as guère fait l'effort de chercher, j'avais déjà donné toute la solution avec des pistes et l'envoi vers le man...

... voila... et si c'était "un devoir"... on a fait le boulot à ta place ce qui ne t'a probablement rien appris alors que tu aurais pu chercher un peu et apprendre !


P.S.: remarque, login est initialisé à NULL pour pouvoir faire un 'free' quoi qu'il arrive, sans se poser la question du fait qu'il y ait eu une erreur de scanf ou rien de saisi. Dans ces cas là, scanf aura laissé la variable inchangée, et un free de NULL fonctionne en ne faisant rien.

Dernière modification par Zakhar (Le 28/03/2019, à 20:21)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#14 Le 28/03/2019, à 20:18

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Merci Zakhar d'avoir pris le temps de toutes ces explications , c'est vraiment tres sympa de ta part !
Comme dit précédement , je suis debutant . J'ai juste éssayé de mixer les quelques premiere lecons lu , afin de voir si ca fonctionne ou pas . A mon tout petit niveau , je ne pouvais pas comprendre toutes tes explications , de plus je ne maitrise pas vraiment l'anglais . Et pour couronner le tout , ma tension occulaire ne me permet pas de rester tres longtemps sur le pc .
  Merci a tous smile

Hors ligne

#15 Le 28/03/2019, à 20:23

Zakhar

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Pas de problème... j'ai plusieurs annnées de C... et c'est sans doute un des langages les plus "délicats".

Je compatis pour les problèmes oculaires. Il m'arrive (de plus en plus souvent) d'avoir des migraines ophtalmiques, dans ces cas là : pas d'écran !


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#16 Le 28/03/2019, à 22:34

grigouille

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

j'utiliserai plutôt fgets.


Xubuntu 18.04

Hors ligne

#17 Le 29/03/2019, à 10:56

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Bonjour ,
   Peut on également le faire de cette maniere ?

     

  1 #include <stdio.h>
  2 int main(void)
  3 {
  4    int jeuDemarre = 1;
  5    char login[20];
  6 
  7     if(jeuDemarre)
  8      {
  9        printf("Afin que le jeux commence ,veuillez rentrer votre login :\n");
 10      }
 11     scanf("%s", login);
 12     printf("votre login est :%s,bienvenue !\n", login);
 13 
 14     return 0;
 15 }
 16 
 17 
~                                                                                               
~                                                                                               
~                                                                                               
~                                                                                               
"char.c" 17L, 294C                                                            4,22         Tout

Hors ligne

#18 Le 29/03/2019, à 12:11

chris7522

Re : [ RESOLU ] Petit programme C n'affiche pas ce que je veux

Zakhar a écrit :

Je compatis pour les problèmes oculaires. Il m'arrive (de plus en plus souvent) d'avoir des migraines ophtalmiques, dans ces cas là : pas d'écran !

Personnellement , j'utilise ces lunettes qui diminue considerablement la fatigue visuelle , ca pourrai etre efficace pour les migraines .
Lunettes prisma pro

Hors ligne