scanner un texte entier

scanner un texte entier - C - Programmation

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

Reply

Marsh Posté le 29-04-2005 à 19:46:19   

Reply

Marsh Posté le 29-04-2005 à 19:56:07    

Reply

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


Message édité par d'jo le 29-04-2005 à 20:10:30
Reply

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              


                j v b    
                e a i
                  i e
                  s n



C'est un peu tordu, non ? Quel est l'interêt ? (Je veux bien me fatiguer, mais pas pour rien...)
 
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-04-2005 à 11:34:29    

un scanf dans une simple boucle? :D

Reply

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 ?

Reply

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  
et pour le scanf dans une boucle ..... j'avoue que je ne voie pas ...ca va me scanner seulement le premier mot non ?


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.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

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.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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

Reply

Marsh Posté le 30-04-2005 à 16:43:07   

Reply

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.

Reply

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


Message édité par d'jo le 30-04-2005 à 17:10:31
Reply

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;
}

Reply

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 ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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é

Reply

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...


Message édité par Emmanuel Delahaye le 30-04-2005 à 18:08:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-04-2005 à 18:06:22    

non je jete un coup d oeil merci quand meme

Reply

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 :
  1. char* rechercher_caractere(char *phrase, char *caractere_recherche)
  2. {
  3.   char *p=phrase; // p est un pointeur que je fais pointer au départ sur le premier caractère de la phrase, puis que je fais progresser dans la phrase jusqu'à trouver le caractère recherché
  4.   while (*p!=caractere_recherche && *p!='\0') // la dernière condition teste la fin de chaine
  5.     p++;
  6.   return (*p==caractere_recherche) ? p : NULL;
  7. }


 
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 :
  1. while (fgets(ligne, 255, fichier)!=NULL)
  2. {
  3.   ...
  4. }


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 :
  1. char ligne[256]

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 :
  1. char *fgets( char *string, int n, FILE *stream );


 
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
 
 

Reply

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.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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


Message édité par d'jo le 30-04-2005 à 18:21:08
Reply

Marsh Posté le 30-04-2005 à 18:21:31    

un exemple c'était tout !!

Reply

Marsh Posté le 30-04-2005 à 18:23:50    

merci jercmoi je n'avais pas vu ton message

Reply

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

Reply

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.


Message édité par Emmanuel Delahaye le 30-04-2005 à 18:35:58

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 ?


Message édité par Emmanuel Delahaye le 30-04-2005 à 18:39:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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!

Reply

Marsh Posté le 30-04-2005 à 18:45:06    

d'jo a écrit :

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!


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...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 !

Reply

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  
char *fgets( char *string, int n, FILE *stream );


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 :

  • Une fonction 'fgets()' qui a 3 paramètres et qui retourne l'adresse d'un char.
  • Le premier paramètre est l'adresse de char. En fait, c'est l'adresse du premier élément d'un tableau de char dans lequel vont être rangés les caractères lus.
  • Le deuxième paramètre est un entier qui représente le nombre max de caractère à lire. Une réserve est faite sur cette valeur pour que les caractères lus forment toujours une chaine valide, c'est à dire terminée par un 0 précédé, si possible, du '\n' (caractère de fin de ligne). Une valeur de 3 est le minimum pour saisir une ligne de 1 caractère.  
  • Le troisième paramètre est l'adresse d'un flux ouvert en lecture. stdin est ouvert par défaut. Il est généralement connecté à la console active, qui est elle même généralement connctée au clavier de la machine, cui qui est assez pratique, il faut le dire...
  • si la lecture est correcte, la fonction retourne l'adresse du tableau de destination. En cas d'erreur de lecture, elle retourne la valeur NULL.


Au boulot...


Message édité par Emmanuel Delahaye le 30-04-2005 à 19:09:51

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-04-2005 à 19:06:03    

ok merci je suis dessus

Reply

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;
}


Message édité par d'jo le 30-04-2005 à 19:13:24
Reply

Marsh Posté le 30-04-2005 à 19:12:53    

moi jferais un mappage en mémoire [:dawao]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 30-04-2005 à 19:15:01    

ah oué non c'est stdin son entree [:pingouino]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

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...

Reply

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 ?
#include <stdio.h>
#include <stdlib.h>
 
int main() {
char text[80];
int i;
 
      printf("Entrez un text : " );


 
      pour être portable, ajouter
 
      fflush (sdtout);
 
http://mapage.noos.fr/emdel/notes.htm#fflush

Citation :


      fgets (text, sizeof text, stdin);


Bien

Citation :


      for (i=0 ; i<80 ; i++)
      {
      printf("%c",text[i]);
      }


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 ?


Message édité par Emmanuel Delahaye le 30-04-2005 à 19:27:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-04-2005 à 19:25:18    

chrisbk a écrit :

moi jferais un mappage en mémoire [:dawao]


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...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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;
}

Reply

Marsh Posté le 30-04-2005 à 19:29:14    

mais je connaissais pas fflush

Reply

Marsh Posté le 30-04-2005 à 19:30:53    

j'avais pas tout lu $

Reply

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...
 
Il s'approche du #1, c'est déjà pas si mal...


 
certes, mais franchement pour de la lecture de fichier c'est quandmeme carrément le moins lourd


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed