我正在开发游戏刽子手的基本实现。
我有一个包含最多 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
>
此代码不需要复杂或高效,因为它是一种罕见的事件,在处理方面,您选择一个新词并且它发生在人类时间范围内,而不是高速处理时间范围内。
关于c - 如何从 C 中的大量单词列表中读取随机字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40412435/