[英]C - Extra new line input while using scanf()
对于使用Visual Studio的Console Win32应用程序,我具有以下“ C”代码。 它检查参数并直接调用函数或使用scanf()
获取输入,然后调用该函数。 如果我提供命令行参数,该程序可以完美运行,但是当我使用scanf()
提供输入时,它可能会添加一个我想避免的额外的换行符。
我知道这样做是因为,当我给出参数时,显示“按ENTER退出...”后,它会等待ENTER输入,但在使用scanf()
时不会这样做。 如果我也使用scanf_s()
则会出现此问题。
感谢您的帮助。
问候,
沙希德
unsigned long int ipv;
unsigned int yrs;
float acr, acl, asp, irr, psp;
if(argc<=1) {
//get inputs
printf("Initial value of portfolio: "); scanf("%lu", &ipv);
printf("Average cash rate: "); scanf("%f", &acr);
printf("Average cost of living: "); scanf("%f", &acl);
printf("Average return for share portfolio: "); scanf("%f", &asp);
printf("Initial removal for living expenses: "); scanf("%f", &irr);
printf("Percentage of shares in initial portfolio: "); scanf("%f", &psp);
printf("Years for the analysis: "); scanf("%u", &yrs);
//simulate the investment with given inputs
simulate(ipv, acr, acl, asp, irr, psp, yrs);
} else {
if (argc == 8) {
//invsim 1000000 0.05 0.036 0.12 0.08 0.5 20
//simulate the investment with given inputs
simulate(atol(argv[1]), (float)atof(argv[2]), (float)atof(argv[3]), (float)atof(argv[4]), (float)atof(argv[5]), (float)atof(argv[6]), atoi(argv[7]));
} else {
printf("Please enter arguments as...\ninvsim.exe ipv acr acl asp irr psp yrs");
}
}
printf("\n\nPress ENTER to quit...");
getchar();
我知道这样做是因为,当我给出参数时,显示“按ENTER退出...”后,它会等待ENTER输入,但在使用scanf()时不会这样做。
这是正确的行为,不是吗? 通过命令行提供参数时,无需按任何ENTER键。 因此,输入缓冲区中没有\\n
。 因此, getchar()
将等待来自stdin
。
但是,当您使用scanf()
输入值时,请在输入后按ENTER键。 对于数值,将扫描数值,但是\\n
(通过按ENTER产生)保留在输入缓冲区中,以供下一个getchar()
读取。 因此,您的代码无需等待 。
解决:添加一个getchar();
在代码的scanf()
部分的末尾,即if
块的末尾。
要改善“暂停”功能,请使用以下更新:
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
我也遇到了这个问题,它是C语言中最令人沮丧的部分之一。我记不清我到底做了什么,但是我记得我最终写了一个小库来处理每种类型的输入,即字符串,号码等
IIRC,我只是使用getline()并使用atoi()和ctype.h中的其他转换函数将字符串解析为所需的类型。 我检查了字符串的长度,如果它是1(?),则发生的唯一方法是缓冲区中是否已有新行,因此我再次调用了getline()。
这样,我可以编写输入验证一次,并使用一百万次。 所以我的代码最终看起来像:
do {
get_int("Enter an integer:", &myInt);//returns -123456789 for invalid input, or such
} while ( myInt <= 0 )//assuming you only wanted positive input
这还有一个很重要的好处,当您输入一个字符串并且scanf()需要一个整数时,不会看到程序崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.