如何通过Windows终端发送EOF

34

我正在尝试理解K&R书中的Example 1.9,但我不知道如何发送EOF。一些资料提到了Ctrl+Z,但那只是终止程序。我用Enter、Ctrl+Z和可能还有Ctrl+V的组合方式成功地发送了EOF,但我无法复制这个组合。

#include <stdio.h>
#define MAXLINE 1000

main()
{
    int len;
    int max;
    char line[MAXLINE];
    char save[MAXLINE];

    max = 0;
    while((len = getline_my(line, MAXLINE)) > 0)
    if(len > max) {
        max = len;
        copy(line, save);
    }
    if(max > 0)
        printf("%s", save);
}

getline_my(s, lim)
char s[];
int lim;
{
    int c, i;

    for(i=0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; i++)// As long as the condition is fulfilled
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        i++;
    }
    s[i] = '\0';
    return(i);
}

copy(s1, s2)
char s1[];
char s2[];
{
    int i;

    i = 0;
    while((s2[i] = s1[i]) != '\0')
        i++;

}

那是针对Unix的...这些是在cmd上的所有命令 http://ss64.com/nt/syntax-keyboard.html - Osama Javed
3个回答

81
你可以通过命令行模拟EOF,对于*nix系统使用CTRL+D,对于Windows系统使用CTRL+Z然后按Enter键。

7
这对我没有用(Windows 10 + Anaconda 终端),但 @mauriceShun 提供的答案有效。 - MrMas
这在 Windows 7 的 cmd.exe 上无法工作(不发送 C 程序正在寻找的 EOF 字符)。 - cmaceachern
17
在Windows系统中,你需要在按下CTRL+Z后再按下ENTER键才能真正发送内容。 - Carl Walsh
1
ctrl-D 需要位于一行的开头。在 Mac OS 上,我先按回车键,然后再按 ctrl-D。 - Kristian Heitkamp

9

在Windows系统中,当您准备完成输入时,请按下 Enter 键,接着再按下 Ctrl+Z,最后再按下 Enter 键以完成输入。

int main(){
    char ch[100];    
    scanf("%[^EOF]",ch);    
    printf("\nthe string is:\n%s\n",ch);    
    fflush(stdin);    
    return 0;    
    }

5
scanf("%[^EOF]",ch);fflush(stdin); 是不好的做法。 - BLUEPIXY
4
这完全是无意义的答案! - Antti Haapala -- Слава Україні
这段文字是正确的,但这个代码……这是个玩笑吗?"%[^EOF]" 是什么意思?你能找一个文档资源来解释一下吗?而且 fflush(stdin) 有什么作用? - wovano

3

总的来说,在Windows上很难轻松地完成旨在类Unix系统下编写的简单K&R代码。你可以发送'^Z^M'(Ctrl-Z再加上Enter)来发送等效于EOF的Windows字符,但是你在此C程序中检查的'EOF'字符并不相同。

简短回答:你无法这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接