Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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
如何将EOF与C中的fgets()一起使用_C_Input_Stdin_Fgets - Fatal编程技术网

如何将EOF与C中的fgets()一起使用

如何将EOF与C中的fgets()一起使用,c,input,stdin,fgets,C,Input,Stdin,Fgets,我试图从终端读入输入,如果有空行并按下enter键,我想停止读取输入。这是我目前的情况 #include <stdio.h> #include <string.h> int main(int argc,char const *argv[]){ char input[1024]; while(fgets(input,1024,stdin)!=NULL){ printf("%s", input); }

我试图从终端读入输入,如果有空行并按下enter键,我想停止读取输入。这是我目前的情况

#include <stdio.h>
#include <string.h>

   int main(int argc,char const *argv[]){
       char input[1024];

       while(fgets(input,1024,stdin)!=NULL){
          printf("%s", input);
       }
       if(EOF){
          printf("EOF");
       }

        return 0;
}
#包括
#包括
int main(int argc,char const*argv[]{
字符输入[1024];
while(fgets(输入,1024,标准输入)!=NULL){
printf(“%s”,输入);
}
如果(EOF){
printf(“EOF”);
}
返回0;
}

您可以做的一件简单的事情是检查
fgets
读取的字符串的长度。
fgets
认为输入字符串末尾的换行符是有效字符。这意味着,如果您刚刚输入一个换行符,那么您正在测试的字符串的长度将是1,因此,您希望将测试移到循环内部,而不是尝试在循环外部测试EOF。因此,您的代码应该如下所示:

#include <stdio.h>
#include <string.h>

int main(void) {
    char input[1024];

    while(fgets(input,1024,stdin)!=NULL) {
        printf("%s", input);
        if(strlen(input) == 1) {
            printf("EOF\n");
            break;
        }
    }
    return 0;
}
#包括
#包括
内部主(空){
字符输入[1024];
while(fgets(输入,1024,标准输入)!=NULL){
printf(“%s”,输入);
如果(strlen(输入)==1){
printf(“EOF\n”);
打破
}
}
返回0;
}

还要注意的是,要使EOF测试正常工作,您不会按enter键,而是将文件结尾键(如linux上的CTRL-d)发送到您的程序。在这种情况下,循环内不会有strlen测试。

您的代码将始终打印
“EOF”
,因为根据标准,
EOF
是非零且固定的。检查空行(仅限单个换行符)非常简单
while(fgets(input,1024,stdin)!=NULL&&*input!='\n')
,但这并不能解决while-loop之后的问题。查找fgets在成功和文件结束时返回的内容。这确实是一种有很好文档记录的行为。我想我以前从未见过有人尝试过
if(EOF)
。。。祝贺您在CW中找到了新的尝试当您在程序中不使用命令行参数时,
main()
的定义的适当形式是
int main(void)
。有趣的是,您有
if(EOF)
的地方是少数几个可能适合使用
feof()的地方之一
相反:
if(feof(stdin))printf(“EOF\n”);否则如果(ferror(stdin))printf(“ERR\n”);else断言(“不可能发生”==0)将是正确的。但要注意: