0

我必须用 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 的同时还有其他选择吗?

4

3 回答 3

4

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

摆脱掉scanf()这是邪恶的。它不会做你认为它会做的事情。

如果要一次获取一个字符,请使用一次获取一个字符的函数。那就是fgetc(stdin)

int c;
while ((c = fgetc(stdin)) != EOF) {
    /* process `c' */
}
于 2013-09-27T20:14:09.363 回答
1

scanfEOF如果在第一次转换(如果有)完成之前发生输入错误,则返回。所以你可以检查一下。但是您每次只读取一个字符,这似乎没有必要,因为您已经检查了 if 的返回值是否1

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

 while (temp != '\n' && end == 1)
 //                  ^^
于 2013-09-27T07:45:53.093 回答
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) ;
于 2013-09-27T07:25:51.280 回答