该函数用于验证输入。它会提示用户输入一个数值(大于或等于0),直到它符合编码。如果任何字符输入在数字之前或之后,则输入将被视为无效。所需输出为:
Enter a positive numeric number: -500
Error! Please enter a positive number:45abc
Error! Please enter a number:abc45
Error! Please enter a number:abc45abc
Error! Please enter a number:1800
嗯,这似乎很容易:
#include <stdio.h>
main() {
int ret=0;
double num;
printf("Enter a positive number:");
ret = scanf("%.2lf",&num);
while (num <0 ) {
if (ret!=1){
while(getchar()!= '\n');
printf("Error!Please enter a number:");
}
else{
printf("Error!Please enter a positive number:");
}
ret = scanf("%.2lf",&num);
}
}
但是,无论输入类型如何,我的代码都会保持Error!Please enter a number:
。有什么建议吗?
答案 0 :(得分:3)
精度修饰符在scanf
中无效。您可以通过启用所有编译器警告(gcc中的-Wall
)轻松验证这一点。这样做的原因是实际输入实际值有多种方法,例如您可以使用0.2
或2e-1
。
如果您只需要2位数,只需使用scanf("%lf",&num)
然后将数字四舍五入。请注意,printf
中的精度修饰符很好:
#include <stdio.h>
int main() {
int ret = 0;
double num = -1;
printf("Enter a positive number:");
ret = scanf("%lf",&num);
while (num < 0 ) {
if (ret != 1){
while(getchar() != '\n');
printf("Error! Please enter a number: ");
}
else{
printf("Error! Please enter a positive number: ");
}
ret = scanf("%lf",&num);
}
printf("Your number is %.2lf",num);
return 0;
}
答案 1 :(得分:1)
我认为使用scanf()进行所需的验证时会遇到问题。首先扫描一个字符串,然后将其转换为数字,你会做得更好。但是scanf()对于char字符串扫描是危险的,因为它的输入长度不受限制,你必须为它提供指向有限长度输入缓冲区的指针。最好使用fgets(),它允许你限制输入缓冲区的长度。
#include <stdio.h>
int main(int argc, char **argv)
{
double num=-1;
char input[80]; // arbitrary size buffer
char* cp, badc; // badc is for detecting extraneous chars in the input
int n;
printf("Enter a positive number:");
while (num < 0)
{
cp = fgets(input, sizeof(input), stdin);
if (cp == input)
{
n = sscanf(input, "%lf %c", &num, &badc);
if (n != 1) // if badc captured an extraneous char
{
printf("Error! Please enter a number:");
num = -1;
}
else if (num < 0)
printf("Error! Please enter a POSITIVE number:");
}
}
printf("num = %f\n", num);
return 0;
}