void getS(char *fileName){
FILE *src;
if((src = fopen(fileName, "r")) == NULL){
printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
exit(-1);
}
//char *get = " ";
int c = 1;
char ch = 'x';
while(ch!=EOF) {
ch = fgetc(src);
if(ch == '\n') c++;
}
fseek(src, 0, SEEK_SET);
int random = rand() % c;
int i = 0;
for(i = 0; i < random; i++){
while(ch != '\n'){
ch = fgetc(src);
}
}
do{
ch = fgetc(src);
if(ch != '\n' && ch != EOF){
printf("%c", ch);
}
}while(ch != '\n' && ch != EOF);
printf("%c", '\n');
fclose(src);
}
所以这是我的职责,抓住一个文件,并在文件中打印出一个随机单词,如果每个字是由新线分离。Ç随机的,有问题
问题1: 为什么随机偏好前两个单词?
问题2:我怎样才能让它可以多次使用这个函数而不用做printf(“%c”,'\ n');因为如果我最终没有那个函数调用,就会覆盖旧的调用函数。
在此先感谢,我一直在问今天谢谢所有帮助stackoverflow! :)
P.S.使用srand(time(NULL));
的''%运营商总是有一些偏差,除非可能的随机值的数量是整除,尽管这可能不是一个显著的问题。但是,避免需要通过文件两次传递是个巧妙的技巧。当你找到第一个词时,你有100%的选择机会。当你找到第二个单词时,你有一个1比2的选择机会。当你找到第三个词时,你有三分之一的选择机会,等等。您需要生成大量的随机数字,但通常比通过文件两次更便宜。 – Steve314
你可能需要仔细检查一下这个概率是否合适,但是,是的,它确实在最后选择了具有相同概率的任何单词。最近有一篇博客文章提到了这一点,但我失去了链接。 – Steve314
您可以使用'putchar(ch)'而不是'printf(“%c”,ch)'......它更清晰更快速。 –