在我的计划中,我只是计算事物的成本。但是,最后我想在程序中稍微休息,要求用户只需按下Enter按钮。我认为getchar()会在这里工作,但它甚至不会停止,它只是继续保持打印。我甚至试图在像scanf(“%s”)之类的稀疏格式之后放置一个空格。
所以有两件事我如何阻止程序在getchar()中请求输入,以及如何让它识别出一个输入按钮。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char hotels_houses[5];
int houses, hotels, cost;
printf("Enter amount of houses on board: \n");
scanf("%s", hotels_houses);
houses = atoi(hotels_houses);
printf("Enter amount of hotels on board: \n");
scanf("%s", hotels_houses);
hotels = atoi(hotels_houses);
printf("Cost of houses: %d\n", houses);
printf("Cost of hotels: %d\n", hotels);
cost = (houses *40) + (hotels * 115);
puts("Click enter to calculate total cash ");
getchar(); /* just a filler */
printf("Total cost: %d\n", cost);
return(0);
}
答案 0 :(得分:0)
我最好的猜测是它在用户输入输入后检索剩余的换行符。您可以打印出返回值进行验证。如果我是正确的,它将是“10”或“13”,具体取决于您的操作系统。
您可能希望将程序更改为使用getline。还有其他关于如何在How to read a line from the console in C?
编写get行的示例答案 1 :(得分:0)
当代码调用scanf("%s", ...
时,程序会等待输入。
您键入“123”并且没有任何反应,因为stdin
是缓冲输入并等待\n
因此系统未向scanf()
提供任何数据。
然后键入“\ n”,并将“123 \ n”赋予stdin
。
scanf("%s",...)
读取stdin
并扫描可选的前导空格,然后扫描非白色空格“123”。最后,它会在stdin
中看到“\ n”并将其放回并完成。
代码再次调用scanf("%s", ...
。 scanf()
扫描“\ n”作为扫描可选前导空格的一部分。然后它等待更多的输入。
您键入“456”并且没有任何反应,因为stdin
是缓冲输入并等待\n
因此系统未向scanf()
提供任何数据。
然后输入“\ n”,并将“456 \ n”输入stdin
。
scanf("%s",...)
读取stdin
并扫描可选的前导空格,然后扫描非白色空格“456”。最后,它会在stdin
中看到“\ n”并将其放回并完成。
最后,您拨打getchar()
并填充,它会从\n
读取上一行的stdin
。
那么该怎么办我停止程序在getchar()中询问输入,如何让它识别出一个输入按钮。
最佳方法:使用fgets()
char hotels_houses[5+1];
// scanf("%s", hotels_houses);
fgets(hotels_houses, sizeof hotels_houses, stdin);
houses = atoi(hotels_houses);
...
// scanf("%s", hotels_houses);
fgets(hotels_houses, sizeof hotels_houses, stdin);
hotels = atoi(hotels_houses);
...
puts("Click enter to calculate total cash ");
fgets(bhotels_houses, sizeof hotels_houses, stdin); // do nothing w/hotels_houses
printf("Total cost: %d\n", cost);
检查来自NULL
的{{1}}返回值对于测试关闭的fgets()
非常有用。
使用stdin
的错误检查优于strtol()
。