2016-11-03 1 views
1

Ich entwickle eine grundlegende Implementierung des Spiels Henker.Wie kann ich eine zufällige Zeichenfolge aus einer großen Liste von Wörtern in C einlesen?

Ich habe eine Textdatei mit den meisten 1000 gebräuchlichen englischen Wörtern, und ich möchte nur zufällig eine davon auswählen, um das Wort in meinem Spiel zu sein.

Ich weiß, ich brauche fopen und fscanf, um das Wort in eine Zeichenfolge in meinem Programm zu bekommen, aber wie wähle ich welche Zeichenfolge zu lesen?

Müsste ich die ganze Liste in ein Array importieren und dann eines davon auswählen? Oder gibt es eine Möglichkeit, einfach das zu scannende Wort auszuwählen?

+1

haben Sie versucht, mit der Funktion rand() eine Zahl zwischen 1 und 1000 zu generieren? – bruceg

+1

Siehe [question] (http://stackoverflow.com/questions/40118509/read-random-line-from-txt-file). –

Antwort

2

Sie nicht müssen Sie alle Wörter in Ihr Programm lesen, nur um eines auszuwählen.

Sie können stattdessen auf einen beliebigen Punkt in der Word-Datei suchen, kriechen, bis Sie eine neue Zeile sehen (oder was auch immer Worte trennt), verwenden fgets() oder scanf() in einem Wort zu lesen und schließen Sie die Datei:

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

void random_word(const char *file_name, char *buffer, size_t length) { 

    FILE *file = fopen(file_name, "r"); 

    if (file == NULL) { 
     fprintf(stderr, "Can't open %s!\n", file_name); 
     exit(EXIT_FAILURE); 
    } 

    (void) fseek(file, 0L, SEEK_END); 
    long size = ftell(file); 

    int c = EOF; 

    while (c == EOF || fgets(buffer, length, file) == NULL) { 
     long offset = random() % size; 

     (void) fseek(file, offset, SEEK_SET); 

     while ((c = getc(file)) != EOF && c != '\n'); 
    } 

    buffer[strlen(buffer) - 1] = '\0'; // remove trailing \n 

    (void) fclose(file); 
} 


int main() { 

    srandom(time(NULL)); 

    char buffer[1024]; 

    for (int i = 0; i < 10; i++) { 
     random_word("/usr/share/dict/words", buffer, sizeof(buffer)); 

     (void) puts(buffer); 
    } 

    return 0; 
} 

Beispiel

> ./a.out 
boloman 
disentrance 
guanase 
decorable 
snibbled 
redemandable 
Cluniac 
balneal 
turbidimetry 
catechistically 
> 

Dieser Code muss nicht komplex noch effizient sein, da es ein seltenes Ereignis ist, die Verarbeitung weist, dass Sie ein neues Wort auswählen und es geschieht auf einer menschlichen Zeit f rame, keine Hochgeschwindigkeitsverarbeitung.

+1

Würde diese Methode keine längeren Wörter bevorzugen? Nicht dass das für Hangman unbedingt ein Problem ist. –

+0

Ich habe gerade versucht, dies zu implementieren und es scheint, dass, wenn ich es ausführe, es das gleiche Wort zwei Mal hintereinander zurückgibt, dann ändert sich; anstatt jedes Mal ein anderes Wort. – Lewiky

+0

Behobenes Problem - Num Gen basiert auf der Zeit, wobei zwei Messungen in zu kurzer Zeit den gleichen Index ergeben. – Lewiky

1

Der einfache Weg ist, in ein Array hineinzulegen und dann einen zufälligen Index zu erhalten. Je komplexer, aber effizienter, ist es, einen Index jedes Wortes zu lesen, in einer anderen Datei zu speichern und dann nur den Sektor zu lesen, in dem das Wort gespeichert ist. Wirklich, einfach in ein Array setzen.

+0

Danke. Das funktioniert jetzt. – Lewiky

Verwandte Themen