Chaine de caractère

Résolu
geophy Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, à toute la communauté CCM

j'ai un tout petit , soucis.
je programme en c sous code::blocks
je voulai savoir quel est la fonction en C qui permet de lire une chaine de caractère qui contient des espaces.
en fait j'ai ecris une fonction(ci dessous) qui demande à l'utilisateur entrez une phrase
ceci n'est q'une partie de mon programme
je constate que dès que je tape par exemple "ville de paris" , mon fichier n'a que le mot ville
quel fonction utilisé pour que la chaine de caractère(contenant des espaces) entrez par l'utilisateur soit totalement enrégistré sur mon fichier
j'ai essayé la fonctions gets , elle aussi ne marche pas

merci d'avance et happy new year 2011 @ TOUS

void chiffrerfichier(int a,int b,char *nom1)
{ FILE *fichier1 ;
char texte[50] ;
printf("entrez votre phrase :") ;
scanf("%19s",texte) ;
fichier1 = fopen("clair.txt","w+") ;
fprintf(fichier1,"%s",texte) ;
printf("\nla position du pointeur : %d\n", ftell(fichier1)) ;
rewind(fichier1) ;
fgets(texte,50,fichier1) ;
fclose(fichier1) ;
}



A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,
Tu peux utiliser scanf, fgets, ...
Le plus simple est d'utiliser la fonction fgets.
Par exemple : fgets(texte, sizeof texte, stdin);
Ceci dit attention, fgets stockera aussi le '\n'.

Cdlt,

Google is your friend
1
geophy Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   5
 
bonjour ,

même la fonction fgets ne marche pas .
le programme ignore completement de l'executer.
j'ai essayé scanf , mais le problème avec cette la fonction il s'arrète lorsqu'il rencontre le caractère espace .
c'est un devoir école , où on demande d'ecrire un programme qui fait du chiffrement affine , mais en se servant des fichiers.

donc j'ai ecri une fonction qui chiffre un message ,mais le problème est que qu'il ne marche qu'avec une chaine de caractère qui ne contient pas d'espace , je t'envoie un bout du code

void chiffrer_fichier(int a,int b,char *nom1,char *nom2)
{ FILE *fichier1 ;
FILE *fichier2 ;
char texte[100] ;
char lettre , lettre1 ;
int nombre , nombre1 ;
printf("entrez votre phrase :\t") ;
scanf("%s",texte) ; ----------------------------------
fichier1 = fopen("clair.txt","w+") ;
fichier2 = fopen("chiffre.txt","w+") ;
fprintf(fichier1,"%s",texte) ;
rewind(fichier1) ;
fgets(texte,100,fichier1) ;
rewind(fichier1) ;
do {
nombre = fgetc(fichier1) ;
lettre = nombre ;
lettre1 = chiffrer_lettre(a,b,lettre) ;
nombre1 = lettre1 ;
fputc(nombre1,fichier2) ;}
while (nombre != EOF) ;
fclose(fichier1) ;
rewind(fichier2) ;
fgets(texte,100,fichier2) ;
printf("\ntexte chiffre: %s\n",texte) ;
fclose(fichier2) ;
}

comment faire pour que se programme puisse gérer le caractère espaces.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
fgets(texte, sizeof texte, stdin); 
on te dit à la place du scanf
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
même la fonction fgets ne marche pas .
C'est qu'il y a un problème en amont.

j'ai essayé scanf , mais le problème avec cette la fonction il s'arrète lorsqu'il rencontre le caractère espace .
Ca marche très bien avec scanf. scanf ne se résume pas à "%s" ou "%19s"... fgets est bien plus simple d'utilisation.

Je n'ai pas tout ton programme donc je ne suis pas sûr de ce que je vais avancer. Mais je verrai bien une erreur classique qui consiste à ne pas vider le buffer clavier...
Par exemple, essaie de mettre un simple getchar() juste avant le fgets.
Cela devrait résoudre le problème. Mais le plus propre serait de bien penser à vider le buffer clavier avant de lire une nouvelle chaîne.

Cdlt,
0
geophy Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   5
 
comment le vider le buffer du clavier.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
As-tu déjà fait comme je t'ai dit : "getchar() avant le fgets()" ???

Sinon pour vider le buffer :
int c;
while( (c=getchar())!='\n' && c != EOF );

Je te conseille de faire une fonction et d'y greffer ce code pour plus de clarté.

Cdlt,
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
void videBuf() 
{ 
   int c; 
   while( (c=getchar())!='\n' && c != EOF ); 

} 
void chiffrer_fichier(int a,int b,char *nom1,char *nom2) 
{ FILE *fichier1 ; 
FILE *fichier2 ; 
char texte[100] ; 
char lettre , lettre1 ; 
int nombre , nombre1 ; 
printf("entrez votre phrase :\t") ; 
videBuf(); 
scanf("%s",texte) ; 
fichier1 = fopen("clair.txt","w+") ; 
fichier2 = fopen("chiffre.txt","w+") ; 
fprintf(fichier1,"%s",texte) ; 
rewind(fichier1) ; 
fgets(texte,100,fichier1) ; 
rewind(fichier1) ; 
do { 
nombre = fgetc(fichier1) ; 
lettre = nombre ; 
lettre1 = chiffrer_lettre(a,b,lettre) ; 
nombre1 = lettre1 ; 
fputc(nombre1,fichier2) ;} 
while (nombre != EOF) ; 
fclose(fichier1) ; 
rewind(fichier2) ; 
fgets(texte,100,fichier2) ; 
printf("\ntexte chiffre: %s\n",texte) ; 
fclose(fichier2) ; 
}  

La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur
1
geophy Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   5
 
slt
merçi pour ta fonction viderbuf
mais j'ai un souci , quel fonction utilisez dans ma fonction chiffrer_fichier
pour la lecture d'une chaine de caractère saisi par l'utilisateur sachant que cette chaine de caractère contient des espaces ?

moi j'ai essayé fgets et gets dans la fonction chiffrer_fichier et toujours rien

cdlt
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Tu pouvais la trouver tout seul la fonction viderBuf. Il a juste fait un copier coller de ce que je t'avais mis dans le code ;-))). D'ailleurs c'est ce que je t'avais conseillé de faire.
Et pour faire plus propre : remplace ta fonction saisir_cle par :
void saisir_cle(int *x , int *y) 
{ int a , b ; 
printf("entrez la valeur de b :\t") ; 
scanf("%d" , y) ; 
viderBuf();
b = *y ; 
do { 
do { 
printf("entrez la valeur de a :\t") ; 
scanf("%d" , x) ;
viderBuf(); 
a = *x ;} 
while((a<=0) || (a>26)) ; 
} 
while(cle_valide(a,b) != 1) ; 
} 

Et si ça ne marche toujours pas, dis-nous ce qui se passe plutôt que de dire ça marche pas. Est-ce le fgets qui saute silencieusement, ou autre...
0