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 会暂停程序,程序会收到 SIGSTOP 而不是 EOF。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 标记,而不是 Ctrl+Z,它将向进程发送 SIGSTP。

因此,当您真正想要的是输入 EOF 字符时,您基本上是在每次按下 Ctrl+Z 时都要求您的进程停止。

于 2012-12-19T10:01:42.797 回答