Pages : 1
#1 Le 02/01/2007, à 21: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, à 21:05)
Et une chaussette de moins.
Hors ligne
#2 Le 02/01/2007, à 21: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, à 22:15
- ffomnislash
Hors ligne
#4 Le 02/01/2007, à 23: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 02/01/2007, à 23:12)
Et une chaussette de moins.
Hors ligne
#5 Le 02/01/2007, à 23:21
- ekra
Re : traitement de chaine
Je crois reconnaitre certaines erreurs :
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 02/01/2007, à 23: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, à 03:18)
Et une chaussette de moins.
Hors ligne
#7 Le 03/01/2007, à 03:53
- Bzh
Re : traitement de chaine
if( strcmp(mot,"bonjour") != 0 ){ }
Faut lire un tit peu la doc
Bon courrage pour la suite !
Dernière modification par Bzh (Le 03/01/2007, à 03:54)
Hors ligne
#8 Le 03/01/2007, à 11: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, à 11:40)
PTC !
GPG Key ID = 5518CFC7
Hors ligne
#9 Le 03/01/2007, à 14: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
merci pour votre aide a tous. maintenant ça devrait beigner.
Et une chaussette de moins.
Hors ligne
#10 Le 03/01/2007, à 19: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, à 11: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, à 12:17)
PTC !
GPG Key ID = 5518CFC7
Hors ligne
#12 Le 04/01/2007, à 19: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, à 20:04
- ekra
Re : traitement de chaine
Si jamais tu as un autre problème n'hésite pas
Bon apprentissage !
PTC !
GPG Key ID = 5518CFC7
Hors ligne
Pages : 1