Bonjour à tous,
Je me suis replongé hier dans un vieux TP de C, et ne me suis couché qu'à 5h du matin... Confronté à un problême insoluble pour moi.
J'ai donc à créer une commande "mgrep", qui a partir d'une suite de ligne (dans un fichier par exemple...) sur l'entrée standard, renvoie sur la sortir standard les lignes contenant le mot passé en paramêtre.
Désolé de vous imposer tout ce code, j'ai tenté de le commenter un maximum (je ne mets pas ici les headers des fichiers (readl.c et fatal.c) :
fatal.c : renvoie une erreur personnalisée :
readl.c : Lit une ligne de 80 caracteres ou moins, renvoie la longueur de la chaine lue, ou "End Of File" si c'est le cas. Place la chaine dans le pointeur en parametre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdio.h> #include <stdlib.h> /* Envoie une erreur sur stderr si assert est different de 0 */ void fatal(int assert, const char* chaine, int status){ if(assert){ fprintf(stderr,"%s \n", chaine); exit(status); } }
mgrep.c : et enfin la fonction main elle même :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdio.h> #include <stdlib.h> #include "fatal.h" #include "const.h" int readl(char* line){ int i=0; char c; c=fgetc(stdin); while (c!=EOF && c!='\n' && i<MAXLINE){ if(c!='\0'){ line[i++]=c; } c=fgetc(stdin); } fatal((i>=MAXLINE), "ligne trop longue (plus de 80 caracteres)", 1); if(c==EOF){return(EOF);} if(c=='\n'){line[i]='\n';} return i; }
RQE : la constante MAXLINE, est définie dans un fichier "const.h" comme valant 81.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include <stdio.h> #include <stdlib.h> #include "readl.h" #include "fatal.h" #include "const.h" /* Affiche sur la sortie standard, les lignes de la chaine ou du fichier de l'entree standard contenant le mot passe en parametre */ int main(int argc, char *argv[]){ int booleanMotTrouve = 0; char* word; char ligne[MAXLINE]; int index; int i; printf("1 \n"); if(argc==2){ word=argv[1]; } else{ fatal(1, "liste de parametres incorrecte", 2); } printf("2 \n"); while(readl(ligne)!= EOF){ for(index=0; index<(readl(ligne)); ++index){ if (ligne[index]== *word){ word++; if(*word=='\0'){ booleanMotTrouve = 1; for(i=0; i<(readl(ligne)+1); ++i){ putc(ligne[i], stdout); } } } } word=argv[1]; } printf("3 \n"); return (booleanMotTrouve==1?0:1); }
Le projet compile parfaitement, donc l'erreur vient clairement d'un problême de conception de ma part...
Lorsque je lance la commande mgrep, suivi d'un mot à chercher, puis d'un fichier sur l'entree standard, il ne se passe rien, et j'obtiens un nouvel invite de commande.
EDIT : j'ai un peu modifié mon code, et à l'éxécution d'une commande type "./mgrep la < text" avec "text" un fichier de plusiseurs lignes, dont certaines contiennent "la", j'obients :
1
2
3
Merci à tout ceux qui prendront le temps de m'aider, et merci déjà d'avoir lu tout ça!
Partager