while((c = getchar())!= EOF)没有终止

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

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

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

还有其他解决方案吗?

这是代码:

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

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

然后在Windows上使用Ctrl + ZF6

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

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

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

 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; } 

如果您使用的是unix系统:

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

这里有几种方法可以为您的程序输入输入,并且能够在输入结束时发出EOF信号:

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

    ./myprog <<<“这是一个可以使用的字符串”

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

    ./myprog

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

 #include  #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,但输入重定向应该类似

改变线

 // 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的平台。

在此处输入图像描述

首先按Ctrl + Z将打印^ Z然后按Enter进入EOF ..

  /* This program will calculate the number of blanks, tabs and new line in a text stream */ #include  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则被视为不同,它们实际上是两个字符。

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

在窗口中按Ctrl + z在turbo c ++中识别EOF这将在程序中充当EOF然后终止程序….同时条件while((c = getchar())!= EOF)