0

だから私は、新しい行にある単語のテキストファイルの行数を取得しようとしています。私はこれまでこの方法を持っていました...

char * 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 = 0;
    char ch = 'x';
    while(ch!=EOF) {
        ch = fgetc(src);
        if(ch == '\n')  c++;
    }
    fseek(src, 0, SEEK_SET);
    printf("%i",c);
    int random = rand() % (c - 1);
    return get;
}

何らかの理由で ch の printf を途中に置くと、正しい行数が得られますが、それ以外の場合は 7801729 になります。

また、0から行数までのランダムなintを作成するにはどうすればよいですか? C で random を使用するという概念は、今のところ私にとってかなり不可解です。

前もって感謝します!

4

1 に答える 1

2

fgetc() は int を返すと思いますが、返された値を (char にキャストせずに) char に詰め込んでいるため、返された int の最初のバイトを適切な場所 (ch 変数内) で取得していますが、さらに 3 バイトが c 変数にオーバーフローします。この変数は、スタックの ch に隣接して定義されています。cをインクリメントすると、最初のバイトが増加します(ビッグエンディアンマシンを使用していることを示唆しています)が、intのこれらの余分な3バイトはそのままで、getc()の戻り値からの上書きによって破損したままになります。そのため、回答の最初のバイトが正しいように見えます。ch を int として定義してみてください。そうすれば問題は解決するはずです (ただし、コンパイラ エラーや警告を回避するためにキャストを追加する必要があるかもしれません)。

于 2012-09-25T04:02:37.303 に答える