2016-10-17 5 views
0

問題空間のために:カスタムのgetline()実装 - whileループ内の

は、どのようにそれがあるwhile ((len = _getline(line, MAXLEN)) > 0)_getline(...)増分内部iになるだろうということが、押されenter keyまで結果を印刷していませんか?

コード例:

#include <stdio.h> 
#include <string.h> 

#define MAXLEN 1000 

int _getline(char s[], int max) 
{ 
    int c, i, l; 

    for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) { 

     printf("%d\n", i); 

     if (i < max - 1) { 
      s[l++] = c; 
     } 
    } 

    if (c == '\n' && l < max - 1) 
     s[l++] = c; 

    s[l] = '\0'; 
    return l; 
} 

int main() 
{ 
    int len; 
    char line[MAXLEN]; 

    while ((len = _getline(line, MAXLEN)) > 0) 
     ; 

    return 0; 
} 
+0

これは 'for 'ループ内に' c!=' \ n "があるからです。そうでなければ' forループ 'は' c!= '\ n''が内部で実行し続けるでしょう。その時点で、プログラムは次の行に移動しますか? – dud3

+0

カスタム 'getline'が' max'に達した後に文字を読み続けるのはなぜですか? –

+1

ファイルレベルでは、アンダースコアで始まる名前は実装用に予約されています。アプリケーションコードで使用してはいけません。 – Olaf

答えて

1
それはどのように

...(様々なものが発生していない)ではなく、押されたキーを入力するまで結果を印刷?

stdinからの典型的な入力は、ラインが緩衝あります。 @John Coleman

又は'\n'を入力するまでは、待機しを待ち、getchar()に利用可能であるが押されていない、またはバッファフィル(多分4K文字)、またはEOFが発生される - それは最初と返しますキャラクター。その後のgetchar()の呼び出しは、バッファされたライン入力を使用してすぐに戻ることがあります。

バッファリングの動作は実装によって異なります。 Cで指定されていません。

+0

もう一つ愚かな質問ですが、 '_getline()'の 'for()loop'は入力中に内部的にループしますか?一度 'getchar()'を実行すると、すべての項目に対してenterとloopを実行します。 私はそれを持っていると思います。「forループ」は、入力が押されるまで単にgetchar()を待っていますか? – dud3

+0

@ dud3 'for'ループはI/Oとは無関係です。 'getchar()'は 'stdin'から何らかの入力があるまで待ってから復帰します。 stdin'は、典型的には、最初の 'GETCHAR()'コールユーザタイプ 'まで_waits_ 12 "\ n" を'意味し、次いで1'' 'と戻り_line buffed_、ある'以来。 'getchar()'は即座に '' 2 ''を返し、 '' getchar() ''は即座に ''\ n''を返します。 "' 'を返し、' '3 ''を返します... – chux

関連する問題