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 + Z或F6
以下将等待\n
或EOF
,这是第一个
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)