Utilisation de gets et de pointeurs

GrandMaitre9 Messages postés 15 Statut Membre -  
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,

J'ai un petit problème, voici une partie de mon code :


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

struct film
{

nom[50];

}

int main()
{

struct film nom;

printf("Quel est le nom du film"); scanf("%s", film.nom);
printf("%s", film.nom);

getch();
return 0;

}


Ceci est un programme pour lire ce que l'utilisateur met comme nom de film, jusque là, tout va bien si le nom a rentrer est "Terminator", mais ça devient plus compliqué pour "Harry Potter", j'ai donc essayé ceci mais ça ne marche pas.

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

struct film
{

nom[50];

}

int main()
{

struct film nom;

printf("Quel est le nom du film"); gets(film.nom);
printf("%s", film.nom);

getch();
return 0;

}

je ne sais pas vraiment comment placer le gets, est-ce que vous pourriez m'aider à y voir plus clair, s'il-vous-plait ?

Merci.

4 réponses

Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Salut.
ta variable c'est "nom" pas "film", ça devrait même pas compiler.
Pourquoi utiliser gets plutôt que scanf ?
0
juliencolin54 Messages postés 238 Statut Membre 55
 
@Chat Snipeur
Pourquoi utiliser gets plutôt que scanf ?
==> Car s'il rentre "Harry Potter", scanf ne met que "Harry" dans sa variable (il s'arrête au premier espace. En tout cas, sans flags supplémentaires dans le formatage de l'entrée, ce n'est pas possible.

Déjà tes erreurs :
- Oubli du point virgule à la fin de ta déclaration de structure
- Mauvais accès à la variable de ta structure. Tu dois le faire comme ceci:
NOM_VARIABLE_TYPE_STRUCTURE.NOM_VARIABLE <=> nom.nom et pas film.nom

C'est vrai qu'il est préférable d'utiliser gets() car c'est plus facilement contrôlable.
Dans ce cas ton code devrait être comme cela :

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

struct film
{
	char nom[50];
};

int main()
{
	struct film nom;

	printf("Quel est le nom du film");
	gets(nom.nom);
	printf("%s", nom.nom);

	getch();
	return 0;
} 


Mais tu peut quand même utiliser scanf() grâce à ses flags.
Dans ce cas ton code pourrait ressembler à cela :

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

struct film
{
	char nom[50];
};

int main()
{
	struct film nom;

	printf("Quel est le nom du film");
	scanf("%49[^\n]", nom.nom);
	printf("%s", nom.nom);

	getch();
	return 0;
} 

=> scanf("%49[^\n]", my_var) en détail :
- %49 pour effectuer un contrôle sur la taille de la saisie
- [] pour préciser une expression rationnelle
- ^\n équivaut à tout sauf (^) le caractère de fin de ligne (\n)
Donc l'entrée correspondra à 49 caractère maximum différents de "\n" (espaces compris)

Cdlt,
0
GrandMaitre9 Messages postés 15 Statut Membre
 
Un grand merci pour tout ceci, je vais voir maintenant la suite de mon code
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Attention, gets() stocke également le caractère '\n' (chose que ne fait pas scanf("%49[^\n]",...). Il faut l'enlever via en remplaçant '\n' par '\0'.

Sinon, gets() est obsolète. Il faut utiliser fgets() (fait la même chose que gets() mais en plus secure) : fgets(nom.nom, sizeof nom.nom, stdin);

Cdlt,
0