2016-11-03 5 views
1

저는 행맨 (hangman)의 기본 구현을 개발 중입니다.C의 큰 단어 목록에서 임의의 문자열을 읽으려면 어떻게해야합니까?

나는 1000 개의 일반적인 영어 단어로 된 텍스트 파일을 가지고 있으며, 그 중 하나를 무작위로 선택하여 게임에서 단어로 사용하고 싶습니다.

필자는 fopen과 fscanf를 사용하여 프로그램에서 문자열을 가져올 필요가 있음을 알고 있지만 읽는 문자열을 선택하는 방법은 무엇입니까?

전체 목록을 배열로 가져온 다음 그 중 하나를 선택해야합니까? 아니면 내가 스캔 할 단어를 선택할 수있는 방법이 있습니까?

+1

rand() 함수를 사용하여 1에서 1000 사이의 숫자를 생성 해 보았습니까? – bruceg

+1

이 [질문] (http://stackoverflow.com/questions/40118509/read-random-line-from-txt-file)을 참조하십시오. –

답변

2

은 모든 단어를 프로그램으로 읽어 들여 하나를 선택해야합니다.

대신, 워드 파일에서 임의의 지점으로 추구 할 때까지 함께 크리프 수 있습니다

당신 (나 단어를 구분 무엇이든), fgets() 또는 scanf()이 한 단어 읽기 및 파일 종료하는 데 사용하는 줄 바꿈을 참조하십시오

#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; 
} 

이 드문 이벤트 처리 - 현명로이 코드는 새 단어를 선택하고 인간 시간 (F)에 발생하는 것으로, 복잡한도 효율적으로 할 필요는 없습니다

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

예 rame, 고속 처리가 아닙니다.

+1

이 방법은 더 긴 단어를 선호하지 않습니까? 그게 교수형 집행 인에게 반드시 필요한 문제는 아닙니다. –

+0

방금이 구현 시도하고 그것을 실행하면 같은 단어를 두 번 연속적으로 반환하는 것 같습니다 다음 변경; 매번 다른 단어보다는 오히려. – Lewiky

+0

수정 된 문제 - Num Gen은 시간을 기준으로합니다. 너무 짧은 시간 간격으로 두 번 읽으면 같은 지수가 나타납니다. – Lewiky

1

쉬운 방법은 배열에 넣고 임의의 인덱스를 얻는 것입니다. 더 복잡하지만 효율적이지만 각 단어의 색인을 읽고 다른 파일에 저장 한 다음 해당 단어가 저장된 섹터를 읽는 것이 좋습니다. 정말 배열에 넣으십시오.

+0

감사합니다. 이 작업을 지금 시작하십시오. – Lewiky