0

K&R から次の C コードをコピーしました。現在、ユーザーが入力した行が最も長い行である場合、コードは行を出力することになっています。これはコードです:

 #include <stdio.h>

#define MAXLINE 1000
int max;
char line[MAXLINE];
char longest[MAXLINE];

int getline();
void copy();


int main(){

    int len=0;
    extern int max;
    extern char longest[];

    max = 0;
    while((len = getline()) > 0)
        if (len > max){

            max = len;
            copy();
        }

    if (max > 0){

        printf("%s", longest);
    }
    return 0;
 }


    int getline(){

    int c;
    int i;
    extern char line[];

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

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

    line[i] = '\0';
    return i;



}




      void copy(){

      int i;
      extern char line[];
      extern char longest[];

       i=0;

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

問題は、それが機能していないように見えることです。コードを実行すると、コンソールに行を入力できますが、最も長い行が出力されません。助けていただければ幸いです。

追加情報: Open Watcom コンパイラで Win7 を使用する I7m。コンソールは折り畳まず、文字を入力できます。また、main() の while-loop を

while((len = getline()) > 0)
        if (len > max){
            printf("IT WORKS");
            max = len;
            copy();
        }

行の長さが現在の最大長よりも長い場合、印刷コマンドで「IT WORKS」が画面に印刷されます。したがって、間違いなく行の長さを数えています。

4

3 に答える 3

5

実際にはそうですが、ファイルの終わりの文字を入力するまで行の読み取りを停止しません。

Unix/Mac では ^D、Windows では ^Z です。(ただし、Windows は実際には端末 EOF を実装していないため、^Z を解釈するのはライブラリまたは Cygwin のようなもの次第であることに注意してください。)

ウィンドウがプログラムの実行中にのみアクティブである場合はsleep(5)、main() の最後に a を付けるとよいでしょう。このようなコンソール I/O プログラムは、Mac のターミナルや Windows の DOS ボックスのような長寿命のウィンドウから実行するのが最善です。

于 2011-07-05T00:48:01.600 に答える
0

getline予想よりも 1 高い値を返すため、ユーザーが Enter キーを押すだけではループを終了しません。getch()また、関数の前return 0に追加するmainと、コンソールは最長の行を出力した後に終了/折りたたみます。多くの本に同じ例があるので、コンソールを開いたままにしたい場合はgetch、プログラムが終了する前にユーザーがキーを押す必要があるようにします。ここで、これらのコードを試してください:

#include <stdio.h>

#define MAXLINE 1000
int max;
char line[4];
char longest[MAXLINE];

int getline();
void copy();


int main()
{
    int len=0;
    extern int max;
    extern char longest[];

    max = 0;
            /* put -1 to getline so it will return the right length... */ 
    while(((len = getline()) - 1) > 0)
    {
        printf("%d \n",len);
        if (len > max)
        {

            max = len;
            copy();
        }
    }

    if (max > 0)
    {

        printf("%s", longest);
    }

            /* Put getch() or getchar() so console will wait for a key to be pressed before exiting */
    getch();
    return 0;
 }


int getline()
{

    int c;
    int i;
    extern char line[];

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

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

    line[i] = '\0';
    return i;
}




      void copy(){

      int i;
      extern char line[];
      extern char longest[];

       i=0;

       while((longest[i]=line[i])!='\0')
        ++i;
      }
于 2011-07-05T00:44:46.440 に答える
0

ここでは問題なく動作しますが、不足しているのは、ループから抜け出すために EOF を getchar() に送信する必要があることだと思います。

Linuxでこれを実行していると思いますよね?その場合は、空の行で CTRL-D (Linux/Unix では EOF を意味します) を押すだけで、プログラムはループを終了し、最も長い行を出力します。

于 2011-07-05T00:48:11.567 に答える