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;
}
Verwenden 'strstr()', dass –
einfach sein, wie genau verwenden strstr i()? ich meine nach dem Öffnen meiner Datei und nach der Verwendung von fscanf wie oben? – frog
'System (" Grep ... ")' ... (Enten und Läufe ... hey, es ist Karneval ...) – DevSolar