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: 乱数が最初の 2 語よりも優先されるのはなぜですか?

質問 2: printf("%c", '\n'); を実行せずにこの関数を複数回使用できるようにするにはどうすればよいですか? 最後にそれがない場合、前の関数呼び出しは古い関数を上書きするだけだからです。

前もって感謝します。今日は少し質問してきました。スタックオーバーフローのすべての助けに感謝します! :)

srand(time(NULL)); を使用した PS

4

2 に答える 2

2

ここでロジックを見てください:

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

改行を押すと、それ以上文字を読み取れないため、常に最初または 2 行目のいずれかを印刷します。

次のように修正できます。

    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 に答える