C - 使用scanf()时的额外新行输入

时间:2015-03-20 06:55:45

标签: c++ c visual-studio scanf

我有下面的' C'使用Visual Studio的Console Win32应用程序的代码。它检查参数并直接调用函数或使用scanf()获取输入,然后调用该函数。如果我给出命令行参数,该程序可以正常工作,但是当我使用scanf()提供输入时,它可能会添加一个我想要避免的额外新行字符。

我知道这样做是因为当我提出参数时,在显示'按ENTER键退出...'后,它会等待ENTER输入,但在使用时不会这样做{ {1}}。如果我也使用scanf(),则会出现此问题。

感谢你的帮助。

此致

沙希德

scanf_s()

3 个答案:

答案 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()期望一个整数时,这也有一个非常重要的好处就是看不到程序崩溃。