Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/01/2007, à 22:02

Zehirmhann

traitement de chaine

bonjour;

j'ai un (petit) probleme; après avoir écopé les tutos et les pages de man je ne vois toujours pas :
voici un bout de mon code avec des 'rajouts' pour être plus clair :
(le fichier test contient "bonjour")

  char mot[100 +1],c;
  FILE * f;
  char * p;
  
  f = fopen("test","r");
  fscanf(f,"%s",&mot);
  fclose(f);

  //je test si 'mot' contient bien "bonjour" en l'écrivant dan un fichier; (printf ne fonctionne pas => programme gtk en cour)
  f = fopen("test","at");
  fprintf(f,"%s",mot);        // ajoute bien la chaine "bonjour" dans le fichier.
  
  c = mot[0];

  fprintf(f,"%c",c); //ecrit bien "b" dans mon fichier
  //mais
  if (c == "b") ... //condition jamais remplie     c semble contenir la valeure ascii de "c"   ;   pourquoi?

  
  fclose(f);

Bon désolé pour la présentation.
Mais mon but final est de vérifier si certains mot sont présents dans un fichier texte.
Comme je n'arrivait pas a faire fonctionner fscanf j'ai tout découpé en sous problème.
En gros je n'arrive pas à m' en sortir et un peu d'aide serai la bien venue ;°))))

Dernière modification par Zehirmhann (Le 02/01/2007, à 22:05)


Et une chaussette de moins.

Hors ligne

#2 Le 02/01/2007, à 22:14

Link31

Re : traitement de chaine

Remplace "b" par 'b'.
"b" est une chaîne, donc un char* contenant le char 'b' et le char \0.
'b' est un char, donc c'est bien ce à quoi tu veux comparer c.

Pense à regarder les warnings lors de la compilation (en l'occurence, la compilation de ton code affiche "attention : comparaison entre un pointeur et un entier").

Hors ligne

#3 Le 02/01/2007, à 23:15

ffomnislash

Re : traitement de chaine

ajoute -Wall a la compilation .


-- Mon blog --

Hors ligne

#4 Le 03/01/2007, à 00:04

Zehirmhann

Re : traitement de chaine

ok merci. j'ai appris quelque chose . ( " "  et  ' ')

Ca me permet de voir que mon problème n'était pas dans la déclaration de fscanf.
Mais si j'en était arrivé a manipuler des char c'était parce-qu'avec des pointeurs ça plantait encore plus :

char * mot;
  FILE * f;
  
  f = fopen("test","r");
  fscanf(f,"%s",&mot);
  fclose(f);

  f = fopen("test","at");
  fprintf(f,"%s",&mot); // ajoute bien la chaine "bonjour" dans le fichier.  et je suis obligé de mettre un &(1)


  if (mot == "bonjour") ... //condition jamais remplie
  
  fclose(f);

(1) : dans une autre partie de mon programme, je déclare ce genre d'exemple  :

char * ex;
fprintf(f,"%s",ex); //avant ex il n'y a pas de & .

Dernière modification par Zehirmhann (Le 03/01/2007, à 00:12)


Et une chaussette de moins.

Hors ligne

#5 Le 03/01/2007, à 00:21

ekra

Re : traitement de chaine

Je crois reconnaitre certaines erreurs :

Zehirmhann a écrit :

ok merci. j'ai appris quelque chose . ( " "  et  ' ')

Ca me permet de voir que mon problème n'était pas dans la déclaration de fscanf.
Mais si j'en était arrivé a manipuler des char c'était parce-qu'avec des pointeurs ça plantait encore plus :

char * mot;
  FILE * f;
  
  f = fopen("test","r");
  fscanf(f,"%s",&mot);   /*** Erreur, il faut allouer de l'espace memoire pour que le pointeur pointe vers une zone memoire réservée. cf malloc. utiliser "mot" plutot que "&mot" est plus naturelle bien que ce soit la meme chose pour des constantes. */
  fclose(f);

  f = fopen("test","at");
  fprintf(f,"%s",&mot); // ajoute bien la chaine "bonjour" dans le fichier.  et je suis obligé de mettre un &(1)
/** Normalement tu ne dois pas mettre le "&" mais il fallait allouer l'espace avant */

  if (mot == "bonjour") ... //condition jamais remplie
/** Utiliser strcmp(mot, "bonjour") dans string.h */
  
  fclose(f);

(1) : dans une autre partie de mon programme, je déclare ce genre d'exemple  :

char * ex; /** Ne pas oublier d'allouer l'espcae !!! */
fprintf(f,"%s",ex); //avant ex il n'y a pas de & .

PTC !
GPG Key ID = 5518CFC7

Hors ligne

#6 Le 03/01/2007, à 00:53

Zehirmhann

Re : traitement de chaine

je viens de changer ça.

:

 
  char * mot = "";
  FILE * f;

  
  f = fopen("test","r");
  fscanf(f,"%s",mot);
  fclose(f);

  if !(strcmp(mot,"bonjour")) ... // attention : comparaison entre un pointeur et un entier.

J'ai reRTFMiser sans comprendre pourquoi strcmp me râle dessus.

Où est-ce que je me trompe ?

Dernière modification par Zehirmhann (Le 03/01/2007, à 04:18)


Et une chaussette de moins.

Hors ligne

#7 Le 03/01/2007, à 04:53

Bzh

Re : traitement de chaine

if( strcmp(mot,"bonjour") != 0 ){ }

Faut lire un tit peu la doc tongue

Bon courrage pour la suite ! wink

Dernière modification par Bzh (Le 03/01/2007, à 04:54)

Hors ligne

#8 Le 03/01/2007, à 12:38

ekra

Re : traitement de chaine

Bonjour,

/* LE PROBLEME EST CI DESSOUS */
char mot[100] ; /* ou char * mot ;     puis     mot=(char*)malloc(sizeof(char)*n) ;      ou n est le nombre de         cactereres reservés souhaités  */
FILE * fp;

  
  fp = fopen("test","rt");
  if (fp==NULL) {
      fprintf(stderr, "Erreur memoire\n");
      exit(1);
}

  fscanf(fp,"%s",mot);
  fclose(fp);

  if (!strcmp(mot,"bonjour")) {
 printf("Mot et bonjour sont egaux !\n");
}

Fait bien attention aux pointeurs et aux zones memoires allouée dynamiquement.

Salut !

Dernière modification par ekra (Le 03/01/2007, à 12:40)


PTC !
GPG Key ID = 5518CFC7

Hors ligne

#9 Le 03/01/2007, à 15:47

Zehirmhann

Re : traitement de chaine

merci pour ton code ekra,

et je viens de trouver ceci:
http://informatique.hepmbc.be/cours/rappel/malloc.php
Je le garde au chaud.

Je me suis bien rendu compte que j'avais des lacunes concernant les pointeurs en c.
Je vais réviser tout ça wink

merci pour votre aide a tous. maintenant ça devrait beigner.


Et une chaussette de moins.

Hors ligne

#10 Le 03/01/2007, à 20:30

Zehirmhann

Re : traitement de chaine

pour info ekra;
voici ce qu'un expert m'a renvoyé suite a ton code :
"
Beaucoup de choses inutilement compliquées. Beaucoup de choses essentielles oubliées...
Code :

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

int main (void)
{
   char const *fname = "test.txt";
   char *mot = malloc (sizeof *mot * 50);

   if (mot != NULL)
   {
      int err = 1;
      FILE *f = fopen (fname, "r");

      strcpy (mot, "");

      if (f != NULL)
      {
         err = fscanf (f, "%s", mot) != 1;
         fclose (f), f = NULL;
      }
      else
      {
         perror (fname);
      }
      if (!err)
      {
         if (strcmp (mot, "bonjour") == 0)
         {
            system ("echo bonjour");
         }
      }
      free (mot), mot = NULL;
   }
   return 0;
}

"

Je ne met pas ça pour te froisser ou quoi que ce soit. Ce n'est pas envers ton code que j'en ai, c'est envers le codage "propre", quasi inaccessible a un débutant.
Et puis pas forcement un débutant d'ailleur.

Je me demande si un exemple comme le tiens est bon, acceptable, ou carrément distrait,
et par rapport a tout ça, quel équilibre trouver dans la programmation sans tomber dans la paranoïa d'un code prouvé..
Entre ne pas fournir un code sale avec certaines choses laissées au hasard, et programmer sans trop se casser les dents pour pondre un code aseptisé.


Et une chaussette de moins.

Hors ligne

#11 Le 04/01/2007, à 12:53

ekra

Re : traitement de chaine

Bonjour je suis désolé, mais
1) Pas mal de trucs inutiles :

char *mot = malloc (sizeof *mot * 50);

Autant definir par char mot[50], tu seras sûr de ne pas avoir d'erreur d'allocation car la memoire est situé dans la pile d'execution. Du coup pas besoin de gérer les erreurs memoire. Ca enleve un sacré bloc...

char const *fname = "test.txt";

On passera plutot par un define

Et puis le code n'est pas clair, c'est pas vrai...

2) je ne t'ai pas fourni tout le code mais simplement les bases. Le but était de résoudre ton problème.
Je pense qu'il faut apprendre les bases avant de meme de savoir gérer les erreurs.

Salut

Dernière modification par ekra (Le 04/01/2007, à 13:17)


PTC !
GPG Key ID = 5518CFC7

Hors ligne

#12 Le 04/01/2007, à 20:42

Zehirmhann

Re : traitement de chaine

Effectivement le code n'est pas très clair.
Et je suis d'accord avec toi sur la priorité des bases.

Ceci dit je préfère apprendre moins vite a prendre de bonnes habitudes. (assonance)

salut


Et une chaussette de moins.

Hors ligne

#13 Le 04/01/2007, à 21:04

ekra

Re : traitement de chaine

Si jamais tu as un autre problème n'hésite pas tongue

Bon apprentissage !


PTC !
GPG Key ID = 5518CFC7

Hors ligne