2008-09-16 12 views
1

はカーニハン&リッチーの「プログラミング言語C」からのサンプルです:c != '\n'あれば、我々はその後s[i++] = cを使用するにもかかわらず、余分な表現を使用するのはなぜですか?ここ

int getline(char s[], int lim) 
{ 
    int c, i = 0; 

    while (--lim > 0; && (c=getchar()) !=EOF && c !='\n') 
    { 
     s[i++] = c; 
    } 

    if (c =='\n') 
    { 
     s[i++] = c; 
    } 

    s[i] = '\0'; 

    return i; 
} 

は、なぜ我々は、チェックすべきですか?

答えて

3

この関数は、EOFまたは改行文字が見つかるまで、標準入力から文字を読み取ります。

2番目のチェックでは、改行文字のみがchar配列に配置されます。 EOFは適切なC文字列ではありません。また、文字が改行でない場合は、C文字列を埋め込んでいる可能性があります。その場合は、それ以上文字を入れないでください。

「\ 0」を追加していることに注意してください。比較の前に評価されるプリフィックス減分を使用するので、我々はC文字列の文字数を1文字増やすことができます。

+0

プリフィックスを減らすことを意味していませんか?私はあなたがコードについての唯一の減少であるように--limについて話していると仮定します。 –

0

新しい行のwhileループを終了するだけです。そうでなければ、身体の中でそれをチェックして休憩を取らなければならないでしょう。

+0

ああ、次の行をキャッチできるので... 本当に簡単です、ありがとうございます。 – willson

1

改行文字( '\ n')に遭遇したときにreadlineが終了するように比較します。それが実行される反復では、文字列に改行を追加せずに終了します。したがって、その後のステートメントは、他の終了条件の1つに達しても文字列が常に改行で終了するようにします。

0

入力の最後でなくても、行末で停止するようにします。その後、改行がある場合、\ nが行末に追加され、\ 0で上書きされないようにもう一度インクリメントします。

0
int getline(char s[], int lim) 
{ 
    int c, i; 
    i=0; 
    /* While staying withing limit and there is a char in stdin and it's not new line sign */ 
    while (--lim > 0; && (c=getchar()) !=EOF && c !='\n') 
    /* Store char at the current position in array, advance current pos by one */ 
     s[i++] = c; 
    /* If While loop stopped on new-line, store it in array, advance current pos by one */ 
    if (c =='\n') 
     s[i++] = c; 
    /* finally terminate string with \0 */ 
    s[i] = '\0'; 
    return i; 
} 
0

質問がわかりません。 c !='\n'は、行の終わり(改行)が発生したときに行の読み取りを停止するために使用されます。さもなければ私達はそれが前に終わる場合でも限界まで常にそれを読むでしょう。 while-loop内の最初のs[i++] = c;は、改行に達しても発生しません。それで、後で特別なテストがあり、ループを壊した改行の場合にはもう一つのs[i++] = c;があります。

0

は、あなたの質問に答えていないが、私はとにかくいくつかのコメントを書きます:

私は、すべてのK & Rのルールを覚えていないが、LIMが1に等しい場合は、リストされてきた機能が失敗します。次に、ループを実行せずにcをunintialisedにしますが、if(c == '\ n')チェックで変数を使用します。

またwhile(-lm> 0; ...)はコンパイラを経由しません。 ';'を削除します。それはそうです。

1

コードにバグがあります。

sのサイズがNバイトで、ユーザーが改行をN-1番目の文字として入力すると、N番目の文字は '\ n'となり、N + 1番目の文字(これは割り当てられていない)は '\ 0'になります。

関連する問題