scanner un texte entier - C - Programmation
Marsh Posté le 29-04-2005 à 19:56:07
while( fgets( ... ) )
{
}
http://www.linux-france.org/articl [...] etc-3.html
Marsh Posté le 29-04-2005 à 20:07:50
scuse je me suis mal exprimé , en fait l'utilisteur tape une phrase par exemple et moi je veux la stocker comme un tableau ou chaque colonne est un mot par exemple
j v b
e a i
i e
s n
Marsh Posté le 29-04-2005 à 20:26:55
d'jo a écrit : scuse je me suis mal exprimé , en fait l'utilisteur tape une phrase par exemple et moi je veux la stocker comme un tableau ou chaque colonne est un mot par exemple
|
C'est un peu tordu, non ? Quel est l'interêt ? (Je veux bien me fatiguer, mais pas pour rien...)
Marsh Posté le 30-04-2005 à 14:36:55
lol c'est pour pouvoir jouer avec les lettres les echangées
et pour le scanf dans une boucle ..... j'avoue que je ne voie pas ...ca va me scanner seulement le premier mot non ?
Marsh Posté le 30-04-2005 à 16:07:51
d'jo a écrit : lol c'est pour pouvoir jouer avec les lettres les echangées |
Avec fgets(), tu lis ligne par ligne. Tu peux donc consituer facilement une collection de lignes (tableau de chaines, tableau de pointeurs sur chaine, liste chainée). Après si tu veux analyser les mots de chaque lignes libre à toi, mais l'organisation caractère par caractère en colonne, j'y crois pas.
Marsh Posté le 30-04-2005 à 16:19:00
si par exemple je tape : "tu vas bien" et je veux transforer la phrase en décalant par exemple et printf renvoi :"nt uva sbie" c'est possible avec fgets ? car je ne vois pas comment acceder à chacune des lettres pour effectuer un algo quelquonque.
Marsh Posté le 30-04-2005 à 16:23:48
d'jo a écrit : si par exemple je tape : "tu vas bien" et je veux transforer la phrase en décalant par exemple et printf renvoi :"nt uva sbie" c'est possible avec fgets ? car je ne vois pas comment acceder à chacune des lettres pour effectuer un algo quelquonque. |
fgets ne fait que placer une ligne dans un tableau de char. Après tu fais ce que tu veux (tu sais accéder à chaque caractère, je rappelle qu'une chaine est un tableau de char terminé par un 0). Tu peux repérer un mot, demander d'inverser des caractères, décaler, (dans chaque cas, ecrire la fonction qui va bien) etc. Que veux tu faire exactement ? Le C n'est qu'un outil que l'on adapte aux besoins. Pas de besoin, pas d'outil.
Marsh Posté le 30-04-2005 à 16:43:07
voila exactment je souhaite associer a chaque lettre une autre lettre ,sorte de codage,j'ai très bien réussi pour un mot , mais pour une phrase je n'y parviens pas.Avec une double boucle sur un scanf(%c) j'y arrive presque mais je trouve ça lourd et pas très malin de plus j'ai des segmentation fault
Marsh Posté le 30-04-2005 à 16:48:43
d'jo a écrit : voila exactment je souhaite associer a chaque lettre une autre lettre ,sorte de codage,j'ai très bien réussi pour un mot , mais pour une phrase je n'y parviens pas. |
C'est exactement pareil pour un mot que pour une phrase.
d'jo a écrit : Avec une double boucle sur un scanf(%c) j'y arrive presque mais je trouve ça lourd et pas très malin de plus j'ai des segmentation fault |
Pourquoi %c et pas %s ?
Et puis fgets c'est mieux que scanf je trouve (j'ai jamais aimé scanf, je trouve son comportement imprévisible dès que l'utilisateur entre n'importe quoi).
Tu stockes une chaîne entière dans un char*, que tu manipules ensuite.
Evite de mélange plusieurs tâches en même temps, ici "lecture de la chaîne" + "mise en forme".
Tronçonne les étapes jusqu'à avoir des tâches très simples, que tu exécutes ensuite une à une.
C'est beaucoup plus simple.
Marsh Posté le 30-04-2005 à 17:09:57
Avec %s il me scan mot par mot alors qu'avec %c c'est chaque lettre , donc avec text[i][j] j'accede directement au caractere souhaité (theoriquement). Pour le fgets je veux bien m'y mettre mais avec seulement 4 séance de C j'ai encore du mal avec les allocation dynamique en rapport avec les char * d'autant je l'on ne connais pas au départ la taille du texte. peut tu me mettre un petit exemple d'équivalence avec le scanf
Marsh Posté le 30-04-2005 à 17:11:32
Mon programme pour tester l'aquisition d'une phrase donne
#include <stdio.h>
int main()
{
int j,i;
char phrase[5][5];
printf("\nentrez une phrase\n" ) ;
for (i=0 ; i<5 ;i++ ){
for (j=0 ; j<5 ;j++ ){scanf("%c",&phrase[i][j]);}
}
for (i=0 ; i<5 ;i++ ){
for (j=0 ; j<5 ;j++ ){printf("%c",phrase[i][j]);}
}
printf("%c ",phrase[0][1]);
return 0;
}
Marsh Posté le 30-04-2005 à 17:36:50
d'jo a écrit : Mon programme pour tester l'aquisition d'une phrase donne |
Comme tu dis c'est lourd! On t'as dit d'utiliser fgets(). Quelle est le mot que tu n'as pas compris ?
Marsh Posté le 30-04-2005 à 17:47:38
comment accederais-tu au "x" avec fgets si l'utilisateur entre: bienvenue aux invités?
Et comment utilise tu le fgets moi j'ai appris avec scanf et en regardant dans le man ... ça m'a pas tellement aidé
Marsh Posté le 30-04-2005 à 18:04:13
d'jo a écrit : comment accederais-tu au "x" avec fgets si l'utilisateur entre: bienvenue aux invités? |
On s'en f*** de fgets(). Une fois qu'on a une ligne, on accède à chaque caractère avec []. Tu les list les posts ou quoi ? On a pas déjà expliqué 3000 fois qu'une chaine de caractère était un tableau de char terminé par un 0 ? Tu ne sais pas acéder aux éléments d'un tableau ? C'est quoi ton livre de C ? Les pages sont collées ou quoi ?
Citation : Et comment utilise tu le fgets moi j'ai appris avec scanf et en regardant dans le man ... ça m'a pas tellement aidé |
Je ne t'ai pas déjà donné ces liens 3000 fois ?
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers
Fait des essais, ça mort pas...
Marsh Posté le 30-04-2005 à 18:11:07
d'jo a écrit : comment accederais-tu au "x" avec fgets si l'utilisateur entre: bienvenue aux invités? |
Pour accéder au "x", moi je créerai une fonction annexe qui recherche un caractère :
Code :
|
Le test final est là pour déterminr si le caractère que tu recherches est bien dans la chaine ou pas. Si ta fonction te renvoie NULL, c'est que le caractère n'est pas dans ta chaine.
La fonction te renvoie l'adresse du "x".
d'jo a écrit : Et comment utilise tu le fgets moi j'ai appris avec scanf et en regardant dans le man ... ça m'a pas tellement aidé |
Pour utiliser fgets, tu fais :
Code :
|
La condition fgets()!=NULL te permet de faire la boucle tant que fgets n'est ps arrivé au bout du fichier (ou qu'il n'y a pas eu d'ereur).
ligne est un char* : c'est là tu vas "ranger" la ligne qui est lue avec le fgets. Par exemple :
Code :
|
est la bonne déclaration ici, car l'argument suivant du fgets (le 255) dit combien de caractères le fgets va lire avant de s'arrêter (à moins qu'il s'arrète avant s'il a rencontré la fin de la ligne).
enfin, fichier est un FILE*
En résumé, voici la syntaxe du fgets :
Code :
|
En espérant que ce que j'ai dit est clair, ce qui n'est pas gagné, mais je pense que j'ai suffisament expliqué pour qu'avec une recherche sous google sur fgets, tu puisses comprendre par toi-même son fonctionnement complet. Un site qui m'a bien aidé à commencer, mais avec uniquement les ordres de base : http://www.lri.fr/~aze/page_c/aide_c/matieres.html
Marsh Posté le 30-04-2005 à 18:11:35
d'jo a écrit : non je jete un coup d oeil merci quand meme |
Ca veut dire quoi merci quand même ? quand même quoi ? C'est quoi le problème ?
Tu voudrais du code tout cuit ? Ben non, c'est pas comme ça que ça marche.
Nous, on est là pour te faire réfléchir. C'est toi qui va trouver la solution, nous on donne des pistes et on recadre, c'est tout.
Marsh Posté le 30-04-2005 à 18:19:45
biensur mais à chaque fois on me donne des liens qui ressemblent au man, moi ce que je veux c'est pas du tout que l'on me donne le code au contraire j'adore trouver , mais pour cela j'ai besoin de comprendre les outils de base c'est à dire comment les utiliser !! C'est juste ce que je voulais pour le fgets !!!!
La d'après le lien que tu m'as donné j'ai l'impression qu'il ne s'adapte pas du tout à ce que je veux faire.
Il peut lire un fichier déjà existant ce qui n'est pas mon cas puisque c'est l'utilisateur qui vas l'entrer
Marsh Posté le 30-04-2005 à 18:32:10
En fait fgets créé un fichier texte constitué de ce que l'utilisateur entre si j'ai bien compris
Marsh Posté le 30-04-2005 à 18:35:38
d'jo a écrit : merci jercmoi je n'avais pas vu ton message |
Maintenant, on attend ton code. Va s'y par étapes :
1 - Saisie d'une ligne
2 - Saisie de plusieurs lignes avec une condition de fin de saisie
3 - Comme 2 mais avec stockage des lignes
4 - Comme 3 mais avec traitement des lignes après la saisie
etc.
Marsh Posté le 30-04-2005 à 18:38:10
d'jo a écrit : En fait fgets créé un fichier texte constitué de ce que l'utilisateur entre si j'ai bien compris |
Non. fgets() lit une ligne à partir d'un flux (stdin, ou fichier ouvert en lecture).
Mais est-ce que tu vas enfin ouvir ton livre de C ou est-ce qu'on est censé te faire un cours de A à Z ? T'es pas un peu fainéeant des fois ?
Marsh Posté le 30-04-2005 à 18:42:36
lol pas du tout.
je ne suis pas chez moi de plus je n'ai pas de livre...
Voilà pourquoi je pose tant de question!
Marsh Posté le 30-04-2005 à 18:45:06
d'jo a écrit : lol pas du tout. |
Alors étudie au moins les tutoriels recommandés par ce site, mais arrête de programmer au hasard...
Alors ton code, il vient ? Tu parles beaucoup, mais je ne vois rien venir...
Marsh Posté le 30-04-2005 à 18:48:48
Mais pour toi c'est peut etre evident mais moi les pointeurs... alors si en plus ils pointent sur des fonctions commme
char *fgets( char *string, int n, FILE *stream );
je suis obliger de tester pour voir à quoi tout correspond !
Marsh Posté le 30-04-2005 à 19:02:40
d'jo a écrit : Mais pour toi c'est peut etre evident mais moi les pointeurs... alors si en plus ils pointent sur des fonctions commme |
Meuh ? Je ne vois pas de pointeurs pointer sur des fonctions...
Citation : je suis obliger de tester pour voir à quoi tout correspond ! |
Tester, ça veut dire quoi ? Appuyer sur tout les boutons jusqu'à ce que ça marche ? Ne vaut-il pas mieux chercher à comprendre la doc ? Tu ne comprends pas l'anglais ?
Nous avons :
Au boulot...
Marsh Posté le 30-04-2005 à 19:12:47
Voiloo j'ai bien compris ça marche presque mais si j'entre une phrase des caracteres bizar apparaissent à la fin ?
#include <stdio.h>
#include <stdlib.h>
int main() {
char text[80];
int i;
printf("Entrez un text : " );
fgets (text, sizeof text, stdin);
for (i=0 ; i<80 ; i++)
{
printf("%c",text[i]);
}
return 0;
}
Marsh Posté le 30-04-2005 à 19:12:53
moi jferais un mappage en mémoire
Marsh Posté le 30-04-2005 à 19:15:01
ah oué non c'est stdin son entree
Marsh Posté le 30-04-2005 à 19:20:36
Tu devrais peut-être arréter d'afficher des caractères quand ce n'est plus ce que l'utilisateur a saisi ? S'il rentre moins de 80 caractères, l'affichage sera un peu n'importe quoi...
Marsh Posté le 30-04-2005 à 19:23:48
d'jo a écrit : Voiloo j'ai bien compris ça marche presque mais si j'entre une phrase des caracteres bizar apparaissent à la fin ? |
pour être portable, ajouter
fflush (sdtout);
http://mapage.noos.fr/emdel/notes.htm#fflush
Citation : |
Bien
Citation : |
Problème. Qui te dis que le tableau a entièrement été rempli ? J'ai pas parlé de '... terminé par un 0' de fois?, T'as pas lu, t'as pas compris ? Il me semble que si text[i] vaut 0 il faut arréter les frais, non ? Tu vas le secouer ce neurone ? Faut que je le décolle au Karcher ?
Marsh Posté le 30-04-2005 à 19:25:18
chrisbk a écrit : moi jferais un mappage en mémoire |
Pas portable. En plus pas la peine de l'embrouiller... Je lui ai concocté un exo en 4 étapes (voir précédemment), j'aimerais bien m'y tenir...
Il s'approche du #1, c'est déjà pas si mal...
Marsh Posté le 30-04-2005 à 19:28:43
la c'est mieux
#include <stdio.h>
#include <stdlib.h>
int main() {
char text[80];
int i;
fflush (stdout);
printf("Entrez un text : " );
fgets (text,sizeof text, stdin);
for (i=0 ; i<strlen(text); i++)
{
printf("%c",text[i]);
}
return 0;
}
Marsh Posté le 30-04-2005 à 19:33:21
Emmanuel Delahaye a écrit : Pas portable. En plus pas la peine de l'embrouiller... Je lui ai concocté un exo en 4 étapes (voir précédemment), j'aimerais bien m'y tenir... |
certes, mais franchement pour de la lecture de fichier c'est quandmeme carrément le moins lourd
Marsh Posté le 29-04-2005 à 19:46:19
voila le sujet en dit long j'aimerai scanner un text en entier afin de pouvoir le modifier . je pensais encadrer un scanf par une double boucle mais si quelqu un aurai une idée moins lourde je serai interessé
merci encore