2016-11-03 49 views
1

我正在开发游戏hang子手的基本实现。如何从C中的大量单词中读取随机字符串?

我有一个最常见的1000个英语单词的文本文件,我想选择其中的一个随机成为我游戏中的单词。

我知道我需要使用fopen和fscanf在我的程序中将字变成字符串,但是如何选择要读入的字符串?

我需要将整个列表导入到一个数组中,然后从中选择一个吗?或者有什么方法可以选择要扫描哪个单词?

+1

您是否尝试过使用rand()函数来生成1到1000之间的数字? – bruceg

+1

请参阅此[问题](http://stackoverflow.com/questions/40118509/read-random-line-from-txt-file)。 –

回答

2

不需要需要将所有的单词读入您的程序中以选择一个。

可以代替寻求在word文件随机点,一起爬,直到你看到一个换行符(或任何分离的话),使用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; 
} 

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

此代码并不需要很复杂,也没有效率,因为它是一个罕见的事件,处理的角度来看,你选择一个新词,它发生在一个人的时间F rame,不是一个高速处理的。

+1

这种方法不会使用更长的单词吗?这并不是说Hang子手一定是个问题。 –

+0

我刚刚尝试实现这一点,似乎当我运行它时,它连续两次返回相同的单词,然后更改;而不是每次都有不同的词。 – Lewiky

+0

已修复问题 - Num Gen是基于时间的,在太短时间内读取两个读数会得到相同的索引。 – Lewiky

1

简单的方法是放入一个数组,然后得到一个随机索引。 更复杂但有效的方法是读取每个单词的索引,保存到另一个文件,然后只读取存储该单词的扇区。真的,把它放在一个数组中。

+0

谢谢。现在就开始工作。 – Lewiky

相关问题