Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C语言中的大量单词列表中读取随机字符串?_C_File_Io_Scanf_Stdio - Fatal编程技术网

如何从C语言中的大量单词列表中读取随机字符串?

如何从C语言中的大量单词列表中读取随机字符串?,c,file,io,scanf,stdio,C,File,Io,Scanf,Stdio,我正在开发一个游戏hangman的基本实现 我有一个包含最多1000个常用英语单词的文本文件,我想随机选择其中一个作为我游戏中的单词 我知道我需要使用fopen和fscanf在我的程序中将单词转换成字符串,但是如何选择要读取的字符串 我是否必须将整个列表导入数组,然后从中选择一个?或者有没有一种方法可以选择扫描哪个单词?简单的方法是放入数组,然后获得一个随机索引。 更复杂但更有效的方法是读取每个单词的索引,保存到另一个文件,然后只读取存储该单词的扇区。 实际上,只需将其放入一个数组。您不需要将所

我正在开发一个游戏hangman的基本实现

我有一个包含最多1000个常用英语单词的文本文件,我想随机选择其中一个作为我游戏中的单词

我知道我需要使用fopen和fscanf在我的程序中将单词转换成字符串,但是如何选择要读取的字符串


我是否必须将整个列表导入数组,然后从中选择一个?或者有没有一种方法可以选择扫描哪个单词?

简单的方法是放入数组,然后获得一个随机索引。 更复杂但更有效的方法是读取每个单词的索引,保存到另一个文件,然后只读取存储该单词的扇区。 实际上,只需将其放入一个数组。

您不需要将所有单词读入您的程序,只需选择一个即可

相反,您可以在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;
}

这段代码不需要复杂,也不需要高效,因为在处理过程中,选择一个新词并在人类时间范围内发生,而不是在高速处理时间范围内,这是一个罕见的事件。

您是否尝试过使用rand()函数生成一个介于1和1000之间的数字?参见此。此方法不支持较长的词吗?对于Hangman来说,这不一定是个问题。我刚刚尝试过实现它,似乎当我运行它时,它会连续两次返回同一个单词,然后改变;而不是每次都用不同的词。修正了问题-Num Gen是基于时间的,在太短的时间内读取两个读数会得到相同的索引。@Lewiky,完全正确。这只是一个种子问题。如果您的程序要求连续输入十个随机单词,则效果良好。但是如果你调用我的例子太快,它会在同一时间重新设定种子并生成同一个单词。“这只是一个例子的产物,不是一个真正的问题。@DavidBowling,你能解释这种偏见吗?”?在我看来,它有更大的机会在一个长单词的中间随机着陆(它忽略和移动过去),然后返回下面的单词。你是说长单词比短单词更容易跟在长单词后面吗?
> ./a.out
boloman
disentrance
guanase
decorable
snibbled
redemandable
Cluniac
balneal
turbidimetry
catechistically
>