C:如何在每次使用scanf一个字符时检查键盘或文件的输入结束

时间:2013-09-27 07:23:55

标签: c input io scanf

我必须在C语言中编写一个程序,一次读取一个字符,我们必须使用scanf。我只使用键盘输入它,但我的老师也将使用文件重定向测试代码。

int end;                                    //return value of scanf
int length1;                                //length of string exp1
char temp,                                  //temp char for input
char exp1[81];                              //string

printf ("Please enter in a regular expression:\n");
end = scanf ("%c", &temp);

while (temp != '\n' || end == 1) {          //check if end of input
   length1 = check(temp, length1, exp1);    //returns length of exp1

   end = scanf ("%c", &temp);               //scan next char for loop
}

我已经在这个小问题上花了好几个小时试图找出来,所以任何指针都有帮助。谢谢!

编辑:我尝试在if语句中使用kbhit()函数来检查它们是否在输入中输入或输入是否来自文件。但是,我没有conio.h,还有什么选择,还在使用scanf吗?

3 个答案:

答案 0 :(得分:1)

您需要将scanf输出与EOF

进行比较
while(scanf("%c", &temp) != EOF)
{
}

您可以将其转换为:

do{          

   length1 = check(temp, length1, exp1);    //returns length of exp1

   end = scanf ("%c", &temp);               //scan next char for loop

}while (temp != '\n' && end != EOF) ;

答案 1 :(得分:1)

如果在第一次转换(如果有)完成之前发生输入故障,

scanf将返回EOF。所以你可以检查一下。但是你每次只读一个字符,这似乎没有必要,因为你已经检查了返回值1

我认为错误在while条件的逻辑中,应该是:

 while (temp != '\n' && end == 1)
 //                  ^^

答案 2 :(得分:1)

你的范围较窄的问题已经得到解答,但是让我给你一个好的建议。如果您没有被迫在课堂上使用scanf()(即您正在编写真实的,生产代码),那么

摆脱scanf()这是邪恶的。它没有按照你的想法做到。

如果您想一次获得一个字符,请使用一次获取一个字符的函数。这是fgetc(stdin)

int c;
while ((c = fgetc(stdin)) != EOF) {
    /* process `c' */
}