重複の可能性:
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]);
}