使用control + D(EOF)但返回意外字符D.

时间:2018-02-04 23:24:59

标签: c

我编写了一个非常简单的程序来检测单词模式,方法是输入stdin并返回找到模式的时间。 但是,代码返回正确的数字,但遵循字符D.

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

#define MAXLINE 1000 /* maximum input line length */

char pattern[] = "ould"; /* pattern to search for */

/* print all lines from standard input that match pattern */
int main()
{
    char line[MAXLINE];
    int found = 0;

    while (fgets(line, MAXLINE, stdin) != NULL)
        if (strstr(line, pattern) != NULL) {
            printf("%s", line);
            found++;
        }
    printf("%d \n", found);
    return 0;
}

结果:

glaroam2-180-76:Lab2 apple$ ./find0
fould
fould
1D

2 个答案:

答案 0 :(得分:2)

代码是正确的(除#include "string.h"之外应该是 #include <string.h> 1 ,问题是当你按下时 您的终端上的 Ctrl + D ,您的终端可能会写 终端上的某些东西,你不能控制,这个输出可能是

^D

fgets返回NULL后,您会printf("%d \n", found);打印&#39; 1&#39;。 但由于终端上有^D^已被&#39; 1&#39;取代。和 你最终得到:

1D

将您的上一个printf更改为此:

printf("\n\n%d \n, found);

你可能只会看到一个&#39; 1&#39;在输出的下一行。

这与您的C程序无关,它与您的终端的行为无关。 例如,当按 Ctrl + D 时,我的终端不打印, 但是当按 Ctrl + C 时,我得到^C。你什么都没有 能做到。

修改

没有什么可以做的我的意思是你无法控制的方式 来自您的终端C程序,无需调用stty等外部工具。而 这可能会解决您的问题,您正在失去可移植性。

但是,在开始编程之前,您可以使用a配置终端 程序如stty。有关详细信息,请参阅Jonathan Leffler的答案。

<强> Fotenotes

1 正如Jonathan Leffler在评论中指出的那样,使用引号代替 系统标题的尖括号本身不是错误。例如我的海湾合作委员会 编译器在编译文件的同一目录中搜索标题 包含在引号中。但总的来说,将这种做法包括在内是一种很好的做法 包含尖括号的系统提供的头文件。

答案 1 :(得分:2)

这是终端设置:echoctl。这意味着当您键入 Control-D 时,终端会回显^D,然后1会覆盖^。尝试使用:

stty -echoctl

然后重新运行您的程序。

话虽如此,我很惊讶D在格式字符串中的%d之后没有被空白消灭。我怀疑你的实际代码可能会丢失。当我在Mac上测试时,%d之后带有空格的程序没有显示D足够长的时间让我发现它;当我删除那个空格时,我得到了问题中显示的输出。