Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序将不会停止遇到EOF或-1_C - Fatal编程技术网

C程序将不会停止遇到EOF或-1

C程序将不会停止遇到EOF或-1,c,C,我是C编程语言的新手 如果输入为EOF或-1,程序将不会从for或while循环停止 程序如下所示: #include <stdio.h> int main() { double nc; for (nc = 0; getchar() != EOF; ++nc) { printf("%.0f\n", nc); } } 没有任何错误或警报,但函数printf似乎无法按预期工作。它只输出我输入的内容。您的程序将在文件末尾停止,这就是EOF的含义 要

我是C编程语言的新手

如果输入为
EOF
或-1,程序将不会从for或while循环停止

程序如下所示:

#include <stdio.h>
int main() {
    double nc;
    for (nc = 0; getchar() != EOF; ++nc) {
        printf("%.0f\n", nc);
    }
}

没有任何错误或警报,但函数
printf
似乎无法按预期工作。它只输出我输入的内容。

您的程序将在文件末尾停止,这就是
EOF
的含义

要从终端输入文件结尾,请在unix或Mac/OS上键入Ctrl-D,在Windows系统上键入Ctrl-ZEnter

按住Ctrl键的同时按Ctrl键,然后按D键,即可获得Ctrl-D

请注意,
double
变量不适用于简单计数器,您应该选择
int
类型


还要注意,程序一次不接收一个字符的输入:当从终端读取时,它可以以行为单位进行缓冲,当从文件读取时,它可以以块为单位进行缓冲。一个POST,您的程序将从终端读取一行输入,并一次读取多行输出,每输入一个字符,包括换行符。

EOF
不是您可以输入的东西,而是文件描述符可以处于的状态

要在控制台上实现此状态,如果运行的是类unix系统,则必须按Ctrl+D


或者,如果您要通过输入一个文件来运行应用程序,您会看到应用程序在读取到文件末尾后将停止

/my\u app

此外,我建议您使用整数类型来计算循环迭代次数,例如
int
,或
size\u t
。浮点类型不适合这种情况。

您误解了

如果在控制台中输入EOF或-1,您将得到以下字符串:
“EOF”、“-1”
。如果逐字读取,将获得序列
'E'、'O'、'F'
'-'、'1'
(数字值,分别提供ASCII/UTF-8:69、79、70和45、49),但不会得到EOF(-1)的数字值


如何实际输入EOF:参见chqrlie的答案,谁比我快…

使用
double
作为递增计数器非常奇怪,浮点变量不适合这个角色。如何输入
EOF
?您不应该键入单词,而是必须使用某种依赖于系统的方式(在Linux中,尝试
Ctrl+D
,在Windows中是
Ctrl+Z
)。使用int作为计数器,而不是双精度计数器。getch()返回在终端中输入的int,-1或EOF不表示文件的结尾。在Linux中使用ctrl+D或在Linux中使用ctrl+ZWindows@Harveybegood:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。谢谢您,Chqrlie(charlie?对不起),即使我使用int作为计数器,以下程序也无法按预期工作(nc=0;getchar()!=EOF;++nc) ; printf(“%d\n”,nc)int main(){int nc;for(nc=0;getchar()!=EOF;++nc){printf(“%d”,nc);}
int main(){int nc;for(nc=0;getchar()!=EOF;++nc);printf(“%d”,nc);}
@Harveybegood:第一个程序为在终端键入的每个字符输出一个数字,直到文件结束,而第二个程序只输出文件结束前的字符类型总数。
(nc=0;getchar()!=EOF;++nc)
循环子句是为循环的每次迭代运行的单个空语句。它的工作原理与您编写的空块
{}
相同。
for (nc = 0; getchar() != EOF; ++nc)
    ;
printf("%.0f", nc);