0
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:为什么 random 优先选择前 2 个词?

问题2:我将如何做到这一点,以便我可以多次使用此功能而无需执行 printf("%c", '\n'); 因为如果我最后没有那个,前一个函数调用只会覆盖旧的。

在此先感谢,我今天一直在问一些问题,感谢stackoverflow的所有帮助!:)

PS 使用 srand(time(NULL));

4

2 回答 2

2

看看这里的逻辑:

    for(i = 0; i < random; i++){
        while(ch != '\n'){
            ch = fgetc(src);
        }
    }

一旦你打了一个换行符,你就不会再读任何字符了,所以你总是要打印第一行或第二行。

你可以像这样修复它:

    for(i = 0; i < random; i++){
        ch = fgetc(src); // start by reading the first character on the line
        while(ch != '\n'){
            ch = fgetc(src);
        }
    }

Jim Balter 还指出,最好将 ch 声明为 int。这是因为 EOF 不被视为常规字符。

于 2012-09-25T04:15:16.397 回答
0

最后没有printf("%c","\n");线它工作正常......

于 2012-09-25T05:06:18.140 回答