我编写了一个非常简单的程序来检测单词模式,方法是输入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
答案 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
足够长的时间让我发现它;当我删除那个空格时,我得到了问题中显示的输出。