5

我一直在阅读“C 编程语言”,并且了解了输入和输出的这一部分。

我读过其他线程说控制台无法识别输入为EOF. 所以我应该在 Windows中使用CTRL+或在 Unix 中使用+ (这些都不适合我)。ZCTRLD

我也读到其他人问同样的问题,他们可以让它工作,他们代码中的问题是语法而不是程序没有终止。

还有其他解决方案吗?

这是代码:

#include <stdio.h>
main()
{
    int nb, nl, nt, c;
    nb = 0;
    nl = 0;
    nt = 0;
    while ((c = getchar()) != '\n'){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    }
    printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
}

编辑:\n应该是EOF,我在发布之前一直在搞乱,我忘了我改变了它:P

它也不适用于 EOF,我只是跳过了那个。

4

8 回答 8

4
while ((c = getchar())  !=EOF) {


}

然后在 Windows 上使用Ctrl+ZF6

以下将等待 a \nor EOF,它先出现

while((c = getchar()) != '\n' && c != EOF){

}
于 2013-09-02T04:39:29.537 回答
4

在 WindowsCtrl-Z上,您单独键入一行(没有空格或任何内容),然后键入Return。在 Windows 上,从技术上讲,您可以跳过 EOF 指示符并继续读取字符,但这不适用于其他操作系统,因为 EOF 实际上意味着 EOF。

于 2013-09-03T02:00:36.633 回答
3

如果您使用的是 unix 系统:

在手动向程序输入输入时通过键盘模拟EOF的唯一方法是按CTRL+D

以下是向您的程序提供输入并能够在输入结束时发出 EOF 信号的几种方法:

./myprog <<< "Here is a string to work with"
  • 或者,您也可以使用输入重定向将包含输入的文件提供给程序。
./myprog < input.file

上面列出的任何方法都可以使用以下代码:

#include <stdio.h>
#ifndef EOF
#define EOF (-1)
#endif
int main(void)
{
    int nb, nl, nt, c;
    nb = 0;
    nl = 0;
    nt = 0;
    while ((c = getchar()) != EOF){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    }
    printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
    return 0;
}
  • 不要让窗口退出游戏。要在 Windows 上的键盘上模拟 EOF,请使用CTRL+Z组合键

不确定unix的here-string格式是否适用于windows,但输入重定向应该类似

于 2013-09-03T02:18:26.763 回答
3
while ((c = getchar()) != '\n'){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 

根据您的 while 循环中的条件,您将无法计算换行数,因为while当用户输入换行符('\n')时,您将停止循环

除此之外,计算空白和制表符也可以正常工作。

CTRL+Z将在 Windows 中被识别为 EOF。但是为了在你的程序中识别它,在 while 循环中使用条件 as ((c = getchar()) != EOF)。现在当用户按下组合键:CTRL+Z时,它将作为 EOF 输入到控制台,程序应该将其识别为字符输入。

这样做将允许您计算输入中的行数

所以,我的建议是:

while ((c = getchar()) != EOF){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 
于 2013-09-02T04:48:53.007 回答
1
    /* This program will calculate the number of blanks, tabs and new line in a text stream */

#include <stdio.h>

main () 
{
    int c,nl = 0, blank = 0, tab = 0; //Newline, blanks and tabs.
    while ((c = getchar()) != EOF) {
        if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++tab;
        else if (c == ' ')
            ++blank;
}
    printf("Tabs = %d\nBlanks = %d\nNewLine = %d",tab, blank, nl);
}

我编写了以下代码,它在 Ubuntu 上正常工作。由于它与您编写的相似,我尝试了代码并且 Ctrl-D 在 UNIX 中正常工作。

我测试了以下代码并意识到如果我们在文本流中输入 \n 它不会增加新行的计数器,对于 \t 选项卡也是如此。只有按 Enter 换行和按 Tab 换行才会被计数器计数,这是需要注意的一点。

发生这种情况是因为按 Enter 实际上会放置一个换行符,它是单个字符,而输入 \n 被视为不同,它们实际上是两个字符。

我认为这会增加这个问题的价值,所以我也解释了这个问题。谢谢。

于 2017-10-13T18:35:11.980 回答
0

首先按Ctrl+Z将打印 ^Z 然后按 Enter 转到 EOF..

于 2014-05-18T15:23:39.347 回答
0

换行

// Buggy, you want calculate the # of '\n' in loop body,
// so logically you shouldn't use it as a stop condition.
while ((c = getchar()) != '\n')

while ((c = getchar()) != EOF)

并尝试Ctrl + C在 Windows 上的控制台窗口中按。它适用于我运行 Win7 的平台。

在此处输入图像描述

于 2013-09-02T04:36:15.653 回答
-2

要在 Turbo C++ 中识别 EOF,请在终端窗口中按Ctrl+ z;这将在程序中充当 EOF,然后终止程序....条件:

while ((c = getchar()) != EOF) 
于 2017-01-15T03:34:48.347 回答