Boucle de scanf et getchar pour récupérer des caractères

Résolu/Fermé
marie12 - 20 mars 2019 à 20:58
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 22 mars 2019 à 09:26
Bonsoir,
voici mon code, si j'enleve le getchar ca ne marche plus, quelqu'un pourrait me dire pourquoi svp
et aussi ya la case indicée par f et g si je remplace son contenu par '#' le reste des cases ne s'affichent pas!


Configuration: Windows / Chrome 72.0.362
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char T[6][10];
int a,b,j,i,f,g;
printf("donnez f et g \n");
scanf("%d %d",&f,&g);
for(a=0;a<2;a++)
{ for(b=0;b<5;b++)
{
printf("\n T[%d][%d]=",a,b);
scanf("%c",&T[a][b]);
getchar();
}
T[a][5]='\0';
}
T[1][4]='#';
getchar();
for(i=0;i<2;i++)
{ for(j=0;j<6;j++)
{
printf("%c",T[i][j]);
}
printf("\n");
}
return 0;
}
6.121

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 21 mars 2019 à 09:59
Salut marie12,

Lorsque tu utilises
scanf()
, cette fonction laisse dans le flux d'entrée standard
stdin
le retour à la ligne
'\n'
qui est envoyé par l'utilisateur dans
stdin
lorsqu'il valide sa saisie avec la touche Entrée.

Comme
'\n'
est un char, il est consommé et lu au prochain
scanf("%c"...
.

Donc, si on prend en compte ces informations, on comprend qu'il se passe la chose suivante :

1-
scanf("%d %d",&f,&g);
lit f et g (qui ne servent à rien dans ton code tel que tu l'as posté), et laisse
'\n'
dans
stdin
...
2- dans la boucle qui suit,
scanf("%c",&T[a][b]);
lit
'\n'
et le stocke dans T à la position indiquée (tu as donc stocké dans le tableau un retour à la ligne provenant de la fin de la saisie précédente)
3- le
getchar();
qui suit lit réellement ce que tu tapes après avoir vu le
printf("\n T[%d][%d]=",a,b);
, mais il ne consomme qu'un caractère et de nouveau il y a
'\n'
qui reste dans le flux
stdin
...
4- la boucle reboucle sur 2-, et donc ton tableau est rempli seulement de
'\n'
car tes lectures sont décalées

Pour recaler l'ensemble, met un
getchar();
après le premier
scanf("%d %d",&f,&g);
, et à ce moment là, tes
getchar();
serviront effectivement à consommer les
'\n'
et tes
scanf()
à lire le
char
tapé

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 21 mars 2019 à 10:08
Sur la façon dont tu as posté ton code, tu auras constaté que ton code est mal posté car il est tout gris et peu lisible, ne colore pas la syntaxe, ne numérote pas les lignes,...

C'est parce que tu l'as posté tout en bas de ton message, dans l'espace réservé à ta signature, qui est grisée (tout ce qui est après "--" est la signature).

Quand tu postes du code, poste le avant ta signature et que veille à choisir le langage c en cliquant sur la flèche basse entre l'icône "<>" et l'icône image) et en sélectionnant le langage de programmation c, comme cela :

<code c>
Ton code ici
</code>

Si tu cliques sur l'icône "<>", cela insère des balises de code génériques <code> qui ne font pas de coloration car elles ne précisent pas le langage concerné.
0
coucou Dal, j'ai essayé ce que tu m'as dit et merci beaucoup ça marche, par contre j'arrive pas a enlever les \n après utilisation de la fonction fgets je galère beaucoup avec les fichiers (je débute) voici un exemple simple sans même que je n'ai a faire printf("%s \n",mot) ça se fait comme ça, on comprend que je n'ai pas réussi a me débarrasser des \n même si j'ai précisé que le nombre maximale des lettres a copier était 6 (5 lettres plus le \0) sachant que je travaille uniquement avec des mots de 5 lettres
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fich;
char mot[30];
fich=fopen("fichier.txt","r");
fprintf(fich,"ecole\n");
fprintf(fich,"fleur\n");
fprintf(fich,"jeudi\n");

while((fgets(mot,6,fich))!=NULL)
{
printf("%s",mot);
}
return 0;
}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 22 mars 2019 à 10:11
De rien :-) Ton problème est donc résolu et tu devrais mettre ce fil de discussion en "Résolu".

Utilise correctement le forum, s'il te plaît :

Maintenant, tu poses une nouvelle question, qui n'a rien à voir et tu devrais poster un nouveau fil de discussion avec cette question et lui mettre un titre pertinent comme "Gestion des retours à la ligne avec fgets" et poster correctement ton code en sélectionnant le langage c comme je te l'ai indiqué très précisément ici.

Ton titre d'origine du présent fil n'est pas non plus pertinent "Remplacer un caractère par un autre". Je propose de le changer en "Boucle de scanf et getchar pour récupérer des caractères". Un titre pertinent permet :
- aux personnes du forum de s'intéresser à ton sujet
- aux futures personnes ayant le même type de problème, de tomber sur ce fil en faisant une recherche et d'être aidées comme tu l'as été

Pour ton nouveau problème, tu dois déjà : ouvrir ton fichier en écriture (en utilisant
fopen()
avec "w") et non en lecture (avec "r") pour pouvoir y écrire dans un premier temps avec
fprintf()
, puis fermer ton fichier avec
fclose()
pour t'assurer de terminer la création et l'écriture du fichier, et seulement après le rouvrir en lecture avec un nouveau
fopen()
(avec "r"), et ensuite utiliser
fgets()
pour lire et voir comme se comporte ton programme. Fais déjà ces corrections avant de poster ta nouvelle question, s'il reste des problèmes que tu n'as pas pu résoudre.
0