我正在开发游戏hang子手的基本实现。如何从C中的大量单词中读取随机字符串?
我有一个最常见的1000个英语单词的文本文件,我想选择其中的一个随机成为我游戏中的单词。
我知道我需要使用fopen和fscanf在我的程序中将字变成字符串,但是如何选择要读入的字符串?
我需要将整个列表导入到一个数组中,然后从中选择一个吗?或者有什么方法可以选择要扫描哪个单词?
我正在开发游戏hang子手的基本实现。如何从C中的大量单词中读取随机字符串?
我有一个最常见的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;
}
例
> ./a.out
boloman
disentrance
guanase
decorable
snibbled
redemandable
Cluniac
balneal
turbidimetry
catechistically
>
此代码并不需要很复杂,也没有效率,因为它是一个罕见的事件,处理的角度来看,你选择一个新词,它发生在一个人的时间F rame,不是一个高速处理的。
简单的方法是放入一个数组,然后得到一个随机索引。 更复杂但有效的方法是读取每个单词的索引,保存到另一个文件,然后只读取存储该单词的扇区。真的,把它放在一个数组中。
谢谢。现在就开始工作。 – Lewiky
您是否尝试过使用rand()函数来生成1到1000之间的数字? – bruceg
请参阅此[问题](http://stackoverflow.com/questions/40118509/read-random-line-from-txt-file)。 –