2017-12-13 5 views
0

"テスト中のループ文"がプログラミングの意味で何を意味するかについては何の結論も出ませんでした。それはループブラケットか中括弧でテストされていますか?それはループによって反復されますか?K&R第1版、練習1.18(for文のテストはうまくいきません)

行使1.18はここにある:

char line[]; 
int max; 

main() 
{ 
    int len; 
    extern int max; 
    extern char save[]; 

    max = 0; 
    while((len = getline(line, MAXLINE))) 
    if (len > max){ 
     max = len; 
     copy(); 
    } 
    if (max > 0) printf("%s",save); 
} 

getline() 
{ 
    int c,i; 
    extern char line[]; 

    for (i=0; i<= MAXLİNE -1 && ((c = getchar())!= EOF) && c != '\n';) 
     line[i++]=c; 
    if (c == '\n') 
    { 
     line[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return (i) ; 
} 

copy() 
{       
    int i; 
    extern char save[]; 
    extern char line[]; 

    int i = 0; 
    while((save[i] = line[i]) != '\0') 
     ++i; 
} 

運動L-18。上記のgetlineのfor文のテストはむしろ です。プログラムを書き換えて明確にしますが、ファイル末尾またはバッファオーバーフロー時に同じ の動作を保持してください。この行動は最も合理的ですか?

+1

新しい本をお持ちください。うんざりすると、「厄介な」という意味です。そうです。 –

+0

"利得が高い"という言葉が何であるかを調べましたか? (i = 0; i <=MAXLİNE-1 &&((c = getchar())!= EOF)&& c!= '\ n';) 'は非常に難しい/読みにくく読みやすくするために –

+0

中括弧は 'for'ループの一部ではありません。 –

答えて

1

コメントからは、コードを読みやすくするためにforループを書き直す必要があるようです。

forループをwhileループに置き換えて、次の解決策を提案できます。

getline() 
{ 
    int c, i; 
    extern char line[]; 

    i = 0; 

    while (i <= MAXLINE -1 && ((c = getchar()) != EOF) && c != '\n') 
    { 
     line[i++] = c; 
    } 

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

    line[i] = '\0'; 

    return i; 
} 

機能を書き直した後にバグがあります。変数cを初期化する必要があり、whileループの最初のサブ条件も変更する必要があります。

ここ

getline() 
{ 
    int c, i; 
    extern char line[]; 

    i = 0; 
    c = EOF; 

    while (i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n') 
    { 
     line[i++] = c; 
    } 

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

    line[i] = '\0'; 

    return i; 
} 

は、その出力は、(Windowsのコンソールアプリケーションとして実行する場合)

ように見えるかもしれません実証プログラム

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

#define MAXLINE 10 

char line[MAXLINE]; 

int getline(void) 
{ 
    int c, i; 
    extern char line[]; 

    i = 0; 
    c = EOF; 

    while (i < MAXLINE - 1 && ((c = getchar()) != EOF) && c != '\n') 
    { 
     line[i++] = c; 
    } 

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

    line[i] = '\0'; 

    return i; 
} 

int main(void) 
{ 
    int max = 0; 
    int len; 
    char save[MAXLINE]; 

    while ((len = getline())) 
     if (len > max) { 
      max = len; 
      strcpy(save, line); 
     } 
    if (max > 0) printf("%s", save); 

    return 0; 
} 

あるようなので、この関数は、たとえば探すことができます

1 
123456789 
12345 
123 
1234567 
^Z 
123456789 
+0

あなたの注意に感謝します!私は本の元のコードをコンパイルし、入力と同じ行をタイプしましたが、プログラムは何の行も答えませんでした(私はTDM-GCC 5.01コンパイラを使います)。 –

+0

@OğuzKaanBULUTあなたのコードには多くのタイプミスが含まれています。たとえば、関数s [i] = '\ 0';でこの文のsは何ですか?それじゃない?関数宣言にはパラメータはありませんが、while((len = getline(line、MAXLINE)))のように呼び出すことができます。コードに記述されているMAXLINEとMAXLİNEには別のシンボルが含まれています。 –

+0

はい、そうでした。私は他のタイプミスも見つけ、ここに投稿した後に修正しました(MAXLINEで初期化された配列)が、もう一度動作しませんでした。 –

関連する問題