while((c = getchar())!= EOF)未终止

时间:2013-09-02 04:29:30

标签: c eof

我一直在阅读“C编程语言”,我得到了这部分输入和输出。

我已阅读其他主题,说控制台无法识别输入为EOF。所以我应该在Windows中使用 CTRL + Z 或在Unix中使用 CTRL + D (这些都不起作用对我来说。)

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

还有其他解决方案吗?

这是代码:

#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,我只是跳过了那个。

8 个答案:

答案 0 :(得分:4)

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


}

然后在Windows上使用 Ctrl + Z F6

以下将等待\nEOF,这是第一个

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

}

答案 1 :(得分:4)

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

答案 2 :(得分:3)

while ((c = getchar()) != '\n'){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 

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

除此之外,计算空白和标签工作正常。

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

执行此操作将允许您计算输入中的行数

所以,我的建议是:

while ((c = getchar()) != EOF){
    if (c == ' ')
        ++nb;
    else if (c == '\n')
        ++nl;
    else if (c == '\t')
        ++nt;
} 

答案 3 :(得分:2)

如果您使用的是unix系统:

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

以下是一些向您的程序输入输入的方法,并且能够在输入结束时发出EOF信号:

  • 使用here string格式将文件的字符串表示形式提供给程序。

    ./ myprog&lt;&lt;&lt; “这是一个与”

  • 一起使用的字符串
  • 或者,您也可以使用输入重定向将包含输入的文件提供给程序。

    ./ myprog&lt; 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退出游戏。要在Windows上的键盘上模拟EOF,请使用 CTRL + Z 组合键

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

答案 4 :(得分: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)

然后在Windows的控制台窗口中按Ctrl + C。它适用于运行Win7的平台。

enter image description here

答案 5 :(得分:0)

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

答案 6 :(得分:0)

    /* 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选项卡也是如此。只有按下新行的输入并按Tab键才能计数器,这是一个需要注意的点。

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

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

答案 7 :(得分:-2)

在窗口中按下turbo c ++中的已识别EOF Ctrl + z 这将在程序中充当EOF,然后终止程序.... while((c = getchar())!= EOF)