2017-02-24 3 views
0

Ich habe ein Array von Wörtern:Überprüfen Sie, ob Worte eines Arrays in einer txt-Datei in C existieren

const char *words[3]={cat,dog,snake,bee};

und eine txt-Datei wie diese:

apple tree day night story bee oil lemons get fight 234 meow woof safari 
jazz stuff what is dog fight street snake garden glass house bee question     
foot head 29191 43493 == 

(wo wir weiß nicht, wie viele Zeilen diese Datei hat)

Ich möchte die gesamte Datei überprüfen und jedes Mal finde ich eines der Wörter des Arrays, um dieses Wort zu drucken und auch die Zeile, wo es gefunden wurde.

Ich habe Probleme mit dem Vergleich. Mein Gedanke war, jedes Wort der Datei in einem Array zu speichern und jedes mit den Wörtern des Wortsarrays zu vergleichen. Aber ich kann das nicht tun. Ich habe dies:

FILE *f; 
const char *arr; 
f=fopen("test.txt","r"); 
while(fscanf(f,"%s",arr)!EOF) 

Ich weiß nicht wirklich, was ich hier schreiben soll, so dass ich die Datei in Worte aufteilen.

Bitte sei nett zu mir, ich versuche nur zu lernen.

+1

Verwenden 'strstr()', dass –

+0

einfach sein, wie genau verwenden strstr i()? ich meine nach dem Öffnen meiner Datei und nach der Verwendung von fscanf wie oben? – frog

+0

'System (" Grep ... ")' ... (Enten und Läufe ... hey, es ist Karneval ...) – DevSolar

Antwort

0

Verwenden getline & strstr

char *line = NULL; 
size_t len = 0; 
ssize_t read; 

int line_no = 0; 
while ((read = getline(&line, &len, f)) != -1) 
{ 
    ++line_no; 
    for (int i = 0; i < 3; i++) { 
     if (strstr(line, words[i]) != null) 
     { 
      // if matched 
     } 
    } 
} 
+0

das gibt mir eine Segmentierung :( – frog

+2

Sie müssen ändern: Wörter [3] - > words [4] –

+0

Vorsicht, 'strstr' sucht nach Teilstrings und nicht nach Wörtern, zum Beispiel wenn" alter "in" manager "gefunden wird, während es nicht das gleiche Wort ist ... –

1

Es gibt mehrere Probleme in den Code-Schnipsel sind Sie zur Verfügung gestellt haben:

const char *words[3]={cat,dog,snake,bee}; 

Hier finden Sie eine Reihe von 3 Elementen deklarieren, aber Sie haben 4 initializers. Und Sie haben vergessen, die Wörter zwischen Anführungszeichen zu setzen.

Hier verwenden Sie fscanf in arr zu lesen, aber du hast keinen Speicher reservieren, arr nicht initialisiert wird, gemeint Sie wahrscheinlich char arr[200], 200 ist die maximale Wortlänge zu schreiben.

FILE *f; 
const char *arr; 
f=fopen("test.txt","r"); 
while(fscanf(f,"%s",arr)!EOF) 

Sie wollen, dass diese als Basis, zäh gibt es noch Raum Form Verbesserung:

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

const char *words[] = { "cat", "dog", "snake", "bee" }; 

int main() 
{ 
    char line[200]; // maximum line size is 200 
    size_t len = 0; 

    FILE *f; 
    f = fopen("test.txt", "r"); 

    if (f == NULL) 
    { 
    printf("Can't open file\n"); 
    return 1; 
    } 

    int line_no = 0; 
    while (fgets(line, sizeof line, f)) 
    { 
    ++line_no; 

    // (sizeof words)/sizeof *words is the the number of words in the words array 
    for (int i = 0; i < (sizeof words)/sizeof *words; i++) 
    { 
     if (strstr(line, words[i]) != NULL) 
     { 
     printf("found %s in line %d\n", words[i], line_no); 
     } 
    } 
    } 

    fclose(f); 
} 
+0

' strstr' sucht nach Teilstrings und nicht nach Wörtern findet "Alter" in "Manager" ... –

+0

@SergeBallesta es ist nur eine Basis, aber ja gibt es Raum für Verbesserungen –

+1

'für (int i = 0; i <(Größe der Wörter)/sizeof * Wörter; i ++)' vergleicht zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlen, sollte 'für (size_t i = 0; i <(sizeof words)/sizeof * words; i ++)' sein. – RoadRunner

1

Sie fscanf() werden mit den Worten aus der Datei zu lesen, die nicht der beste Weg, dies zu tun . Sie sollten getline(3) oder fgets(3) verwenden, um jede Zeile Ihrer Datei zu lesen.

Darüber hinaus ist diese Zeile:

const char *words[3]={cat,dog,snake,bee}; 

Bedürfnisse in der Lage sein zu halten 4 char* Zeiger, nicht 3. Sie werden auch Zitate mit diesem Stringliterale umfassen müssen. Dies ist ein weiterer Weg, dies zu tun:

const char *words[] = {"cat", "dog", "snake", "bee"}; 

dann die Größe dieses Arrays zu erhalten, nur sizeof(x)/sizeof(x[0]) verwenden.

Ferner wird in diesem Codesegment:

FILE *f; 
const char *arr; 
f=fopen("test.txt","r"); 
while(fscanf(f,"%s",arr)!EOF) 

Du fscanf() auf einem nicht initialisierten Zeiger verwenden, was zu vielen Problemen führt.Wenn Sie einen Zeiger verwenden möchten, müssen Sie möglicherweise arr auf dem Heap mit malloc(3) dynamisch zuweisen. Wenn Sie dies nicht wünschen, deklarieren Sie einfach einen VLA wie char arr[200]. Auch fscanf() gibt die Anzahl der gescannten Objekte zurück, so dass fscanf(f,"%s",arr)!=EOF durch fscanf(f,"%s",arr)==1 ersetzt werden muss, um sicherzustellen, dass jeweils ein Wort gelesen wird.

Hinweis: Sie sollten auch prüfen, ob FILE *f korrekt geöffnet wurde, da es bei Fehler NULL zurückgeben kann.

Ich habe Probleme mit dem Vergleich. Mein Gedanke war, jedes Wort der Datei in einem Array zu speichern und jedes mit den Wörtern des Wortsarrays zu vergleichen.

Wie andere erwähnt haben strstr(3) zu verwenden, eine weitere mögliche Option ist strtok(3) zu verwenden, um jedes Wort in der Zeile zu analysieren, dann strcmp(3) verwendet words[i] mit dem Wort aus der Datei analysiert zu vergleichen. Wenn words[] in der Zukunft größer wird, würde ich empfehlen, die binäre Suche anstelle der linearen Suche zu verwenden, um die Wörter zu vergleichen. Dies wird Ihre Suchzeit von O (n) bis O (logn) verbessern.

Hier einige (modifiziert) Code, den ich schrieb, bevor die macht etwas Ähnliches:

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

#define ARRAYSIZE(x) (sizeof x/sizeof x[0]) 

int main(void) { 
    const char *words[] = {"cat", "dog", "snake", "bee"}; 
    FILE *fptr; 
    char *line = NULL, *word = NULL; 
    const char *delim = " \n"; 
    size_t len = 0, lineno = 0; 
    ssize_t read; 

    fptr = fopen("somewords.txt", "r"); 
    if (fptr == NULL) { 
     fprintf(stderr, "Error reading file\n"); 
     exit(EXIT_FAILURE); 
    } 

    while ((read = getline(&line, &len, fptr)) != -1) { 
     lineno++; 
     word = strtok(line, delim); 
     while (word != NULL) { 
      for (size_t i = 0; i < ARRAYSIZE(words); i++) { 
       if (strcmp(word, words[i]) == 0) { 
        printf("Found matched word: %s, Line number: %zu\n", word, lineno); 
       } 
      } 
      word = strtok(NULL, delim); 
     } 
    } 

    free(line); 

    fclose(fptr); 

    return 0; 
} 
Verwandte Themen