Seite 1 von 2
grep in C
Verfasst: Di Aug 12, 2014 12:32 pm
von Daniel200289
Hallo Leute,
ich hab eine weitere Frage zu einem Problem in C.
Folgendes möchte ich gerne umsetzten, weiß aber leider gar nicht wie ich ansetzten soll. Hat jemand Ideen oder Tipps für mich?
grep PATTERN [FILE] soll nach einem Muster innerhalb einer Datei suchen und den Inhalt der
betroffenen Zeilen, in denen ein Muster gefunden wurde untereinander auflisten (es muss nicht
Zeilenubergreifend nach Mustern gesucht werden):
/home/max/ $ grep include test.c
#include <stdio.h>
#include <stdlib.h\>
/home/max/ $
Zur weiteren Erklärung: Ich bin dabei, eine Shell zu programmieren, alles weitere wie die Eingabe etc. steht. In meinem Fall habe ich bei der Eingabe von grep include test.c den Eingabestring schon so weit unterteilt, dass ich include und test.c übernehme. Wie kann ich den grep Befehl am besten umsetzten?
Danke schonmal

Re: grep in C
Verfasst: Di Aug 12, 2014 12:38 pm
von oenone
Wenn FILE übergeben wird, öffne sie, ansonsten nimm stdin.
Dann zeilenweise die Datei auslesen und mit Suchfunktionen aus
string.h mit dem PATTERN vergleichen. Wenn übereinstimmt -> Ausgabe, sonst nichts.
Woran hängt es denn?
Re: grep in C
Verfasst: Di Aug 12, 2014 12:43 pm
von Daniel200289
Es hängt daran wie ich die Datei Zeilenweise auslese und mit dem Pattern vergleiche. Ich programmiere noch nicht so lange in C. Die Ausgabe bei Übereinstimmung ist dann kein Problem. Das verstehe ich soweit.
Re: grep in C
Verfasst: Di Aug 12, 2014 12:58 pm
von oenone
Zum Lesen einer Zeile gibt es
fgets. Dort findest du auch ein Anwendungsbeispiel. Von den oben verlinkten Suchfunktionen wäre wohl
strstr für ein einfaches "enthält string XYZ" geeignet.
Re: grep in C
Verfasst: Mi Aug 13, 2014 9:29 am
von Xin
Daniel200289 hat geschrieben:Es hängt daran wie ich die Datei Zeilenweise auslese und mit dem Pattern vergleiche.
Warum möchtest Du die Datei zeilenweise auslesen? Was wenn Dein Pattern "Hallo\n\n\nWelt" ist?
Stell Dir die Datei doch als eine Zeile vor in der Du ein Pattern suchst. Beim durchsuchen merkst Du Dir das letzte Newline und wenn Du es findest, suchst Du das nach dem Pattern folgende Newline. Den Text dazwischen gibst Du aus.
Grep erlaubt Regular-Expressions. Möchtest Du diese ebenfalls abbilden?
Re: grep in C
Verfasst: Mi Aug 13, 2014 12:48 pm
von Daniel200289
Ich möchte folgendes Darstellen:
Nehmen wir an wir haben eine Datei beispieldatei mit folgendem Inhalt
fjabc
dasfd
sdgsf
abcj
kfk
fkabc
Dann soll meine Shell mit dem Befehl "grep abc beispieldatei" (grep "Pattern" "File") folgendes ausgeben:
1 fjabc
2 abcj
3 fkabc
Sprich jede Zeile, die das Pattern mindestens 1 mal beinhaltet wird aufgelistet.
Wer möchte, darf mit gerne ein bisschen Beispielcode angeben, hänge nach dem öffnen der Datei noch daran, die beiden Strings (sprich ich habe den Inhalt der Datei in einen String geschrieben), so zu vergleichen, dass ich die oben genannte Ausgabe bekomme. Im Moment bekomme ich nur mit strstr() hin, dass wenn das Pattern im String vorhanden ist, dass dies dann 1 zurück gibt.
Re: grep in C
Verfasst: Mi Aug 13, 2014 12:57 pm
von Xin
Wie bist du an eine solche Aufgabe gekommen? ^^
Versuch doch erstmal Dir ein strstr() selbst zu schreiben. Das kannst Du dann nach belieben modifizieren.
Re: grep in C
Verfasst: Mi Aug 13, 2014 2:07 pm
von Daniel200289
Uniaufgabe

die wollen direkt die kompliziertesten Sachen programmiert haben. Deswegen bin ich ja auch für jede Hilfe und jeden Tipp dankbar.
Re: grep in C
Verfasst: Mi Aug 13, 2014 3:09 pm
von Xin
Daniel200289 hat geschrieben:Uniaufgabe

die wollen direkt die kompliziertesten Sachen programmiert haben. Deswegen bin ich ja auch für jede Hilfe und jeden Tipp dankbar.
Dachte ich mir. ^^
Wie gesagt... strstr() zu implementieren ist keine große Aufgabe.
Überlege Dir wie Du erkennst, dass eine Zeile beginnt, dann such Dein Pattern. Wenn Du den Beginn Deines Patterns gefunden hast, nimmst Du Buchstaben für Buchstaben hin - ist Dein Pattern zu Ende, hast Du eine Fundstelle - und Du weißt, wo Du den Zeilenanfang erkannt hast. Vom Zeilenanfang bis zur nächsten Zeile hinter dem Pattern gibst du alles aus.
So würde ich das machen.
Re: grep in C
Verfasst: Do Aug 14, 2014 2:12 pm
von Daniel200289
Okay soweit verstanden danke =)
Nur eins ist noch unklar: Beispiel:
Code: Alles auswählen
int main ()
{
char str[] = "Dies ist ein 981 string";
char *ptr;
ptr = strstr (str, "981");
printf(ptr);
return 0;
}
Hier wird ja explizit nach der Zahl 981 gesucht.
Nun möchte ich aber prüfen, ob Zahlen von 0 bis 1000 in dem String sind, und nicht nur die 981 Wie baue ich dies mit einer Schleife am Besten ein?
Also das ist so gemeint:
Als Beispiel nenne ich eine Variable int i = 1000. Nun soll mein Programm von 1000 herunterzählen, und in jedem Schritt prüfen, ob meine Zahl im String vorkommt. Dann soll die Schleife anhalten. Sprich was ich suche: Die höchste Zahl in einem String.
Ich werde nämlich einen String aus einer Datei lesen, deren Zeilen durchnummeriert sind. Ich möchte die Datei dann laden (Code schon fertig) und mit der Nummerierung automatisch fortfahren.
Also meine Datei lautet z.B.
1 hallo
2 hallo2
3 tschö
nun möchte ich die Datei laden und möchte, dass mein Programm automatisch eine 4 in die nächste Zeile schreibt. Dies soll halt maximal bis 1000 gehen.
Vielleicht fällt euch was ein =)