我有下面的' C'使用Visual Studio的Console Win32应用程序的代码。它检查参数并直接调用函数或使用scanf()
获取输入,然后调用该函数。如果我给出命令行参数,该程序可以正常工作,但是当我使用scanf()
提供输入时,它可能会添加一个我想要避免的额外新行字符。
我知道这样做是因为当我提出参数时,在显示'按ENTER键退出...'后,它会等待ENTER输入,但在使用时不会这样做{ {1}}。如果我也使用scanf()
,则会出现此问题。
感谢你的帮助。
此致
沙希德
scanf_s()
答案 0 :(得分:0)
我知道这样做是因为当我提出参数时,在显示'按ENTER键退出...'后,它等待ENTER输入,但在使用scanf时不会这样做()。
这是正确的行为,不是吗?当您通过命令行提供参数时,您不会按任何 ENTER 键。因此,输入缓冲区中没有\n
。因此,getchar()
将等待来自stdin
的输入。
但是,当您使用scanf()
摄入值时,请在输入后按 ENTER 键。对于数值,扫描数值,但\n
(通过按 ENTER 生成)保留在输入缓冲区中,由下一个getchar()
读取。因此,您的代码不会等待。
要解决:在getchar();
部分代码的末尾添加一个scanf()
,即在if
块的末尾。
答案 1 :(得分:0)
要改善“暂停”功能,请使用以下更新:
printf("\n\nPress ENTER to quit...");
while( getchar() != '\n' ); // clear the input buffer after reading numbers with scanf
getchar(); // wait for new input
修改强>
考虑到您的计划的if-else
,移动上面的建议while
循环:
printf("Years for the analysis: ");
scanf("%u", &yrs);
while( getchar() != '\n' ); // clear the input buffer
答案 2 :(得分:0)
我也遇到了这个问题,它是C中比较令人沮丧的部分之一。我无法记住我所做的事情,但我记得我最后写了一个小型库来处理每种类型的输入,即字符串,数字等。
IIRC,我刚刚使用了getline()并使用atoi()和ctype.h中的其他转换函数将字符串解析为我需要的类型;我检查了字符串的长度,如果它是1(?),唯一的方法就是缓冲区中已经有一个新行,所以我再次调用了getline()。通过这种方式,我可以编写输入验证ONCE,并使用它一百万次。所以我的代码最终看起来像:
do {
get_int("Enter an integer:", &myInt);//returns -123456789 for invalid input, or such
} while ( myInt <= 0 )//assuming you only wanted positive input
当你输入一个字符串并且scanf()期望一个整数时,这也有一个非常重要的好处就是看不到程序崩溃。