2

重複の可能性:
C プログラミング言語の EOF とは?

K&R C プログラミング言語を学んでいたとき、コンソールからいくつかの行を読み取り、すべての入力を出力するプログラムを作成しようとしています。入力ストリームを終了するには、ctrl-z (EOF) を使用する必要があります。しかし、問題は、ctrl-z をタップしているときにプログラムが停止し、すべての入力をコンソールに出力できないことです (gdb には、「プログラムが信号 SIGTSTP、停止しました (ユーザー。__kernel_vsyscall() で 0X00132416) を受信しました」と表示されます)。この終了シグナルを処理するために kill 関数を使用しようとしましたが、失敗しました。コンソールにすべての入力行を出力させるにはどうすればよいですか。私のコードの一部は次のとおりです。

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

#define MAXLINES   5000     /* possibly max amount of lines */
char *lineptr[MAXLINES];    /* pointers to lines read */

int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);

main(int argc, char *argv[])
{
    int nlines;         /* number of lines read */


    **if ((nlines = readlines(lineptr, MAXLINES)) >= 0)** {//program finished when I tap ctrl-z 

    writelines(lineptr, nlines);            // from this line can't be run   
    return 0;
    } else {
    printf("input too big to sort\n");
    return 1;
    }
}

#define MAXLEN 1000
int get_line(char *, int);
char *alloc(int);

/* readlines : read the input */
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
    nlines = 0;
    while ((len = get_line(line, MAXLEN)) > 0)
    if (nlines >= maxlines || (p = alloc(len)) == NULL)
        return -1;
    else {
        line[len - 1] = '\0';
        strcpy(p, line);
        lineptr[nlines++] = p;
    }
    return nlines;
}

/* writelines : output the readlines */
void writelines(char *lineptr[], int nlines)
{
    int i;

    for (i = 0; i < nlines; i++)
    printf("%s\n", lineptr[i]);
}
4

3 に答える 3

2

Linux/Unix プラットフォームで作業している場合、ctrl-z はプログラムを中断し、プログラムは EOF ではなく SIGSTOP を受け取ります。EOF は通常 ctrl-D です。stty -a コマンドを実行して、端末回線の設定を設定/変更します。ctrl-z を使用する必要がある場合は、stty 設定を変更してください。

お役に立てれば。

于 2012-12-19T10:02:52.683 に答える
1

Ctrl+Zは、ほとんどの Linux 端末でサスペンド シグナルを送信します。Linux では、EOF は通常Ctrl+Dです。

Ctrl+Zは Windows では EOF です。

于 2012-12-19T09:45:18.153 に答える
0

Linux では、Ctrl+D は EOF マーカーであり、プロセスに SIGSTP を送信する Ctrl+Z ではありません。

したがって、本当に必要なのは EOF 文字を入力することだったのに、Ctrl+Z を押すたびにプロセスを停止するように基本的に要求していました。

于 2012-12-19T10:01:42.797 に答える