0

このコードはTheCAnswerBookで見つかりました。

int readline(char s[], int lim) {
    int i,c,j=0;
    for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) {
        if(i<lim-2) {
            s[j]=c;
            ++j;
        }
    }
    if(c=='\n') {
        s[j]=c;
        ++j;
        ++i;
    }
    s[j]='\0';
    return i;
}

私は自分のバージョンを書きました:

int readline(char line[], int lim) {
    int c, i;
    for(i=0; (c=getchar())!=EOF && c!='\n'; ++i) {
        if(i<lim-2) {
            line[i]=c;
        }
    }
    if(c=='\n') {
        line[i]=c;
        ++i;
    }
    line[i]='\0';
    return  i;
}

カウンターとして1つの変数''のみを使用iしましたが、元のバージョンではカウンターとして2つの変数' i'と' j'を使用しました。2つの違いは何ですか?

それらの違いを教えてください。

4

2 に答える 2

5

関数の2番目のバージョンは、初期化されていない部分を残し、最初のループがそれを超えて続く場合line、バッファの終わりを超えて最後の'\ n'、'\0'を書き込むリスクがありますlinei<lim-2

于 2012-12-19T11:26:25.143 に答える
3

ユーザーが複数のlim-2文字を入力した場合、最初のバージョンは正しく機能し、2番目のバージョンはline:の終わりを超えて書き込みます。

if(c=='\n') {
    line[i]=c;  <<=== here
    ++i;
}
line[i]='\0';   <<=== and here 

これは、実際に2つの変数が必要であることを意味するものではありません。1つを使用できますが、ループの後でキャップする必要があります。コードが読みやすくなると思うことは何でもしてください。

于 2012-12-19T11:27:12.867 に答える