我正在尝试创建一个程序来检查用户输入的数字是否为浮点数,但它不起作用。我尝试使用QWebView
进行检查,但这也无效。
scanf
答案 0 :(得分:7)
您是否阅读了有关scanf(3)
的任何文档?
您需要像这样检查返回值
double value;
if (scanf("%lf", &value) == 1)
printf("It's float: %f\n", value);
else
printf("It's NOT float ... \n");
有一种我更喜欢的方式,因为它可以更好地控制后续输入,scanf()
很少有用。而是尝试fgets()
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char buffer[100];
double value;
char *endptr;
if (fgets(buffer, sizeof(buffer) stdin) == NULL)
return -1; /* Unexpected error */
value = strtod(buffer, &endptr);
if ((*endptr == '\0') || (isspace(*endptr) != 0))
printf("It's float: %f\n", value);
else
printf("It's NOT float ...\n");
}
答案 1 :(得分:3)
测试字符串是否转换为double
的最佳方法是使用strtod()
。
strtod()
可能很难使用。使用strtod(char *s, char *endptr)
,如果s == endptr
,则转换失败。否则,检查从endptr
开始的字符串是否有违规字符。
此处未解决溢出/下溢问题,除了说strtod()
,转换为float
很容易转换为零或无穷大 - 两者通常都可以表示为float
。< / p>
#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>
bool is_float(const char *s, float *dest) {
if (s == NULL) {
return false;
}
char *endptr;
*dest = (float) strtod(s, &endptr);
if (s == endptr) {
return false; // no conversion;
}
// Look at trailing text
while (isspace((unsigned char ) *endptr))
endptr++;
return *endptr == '\0';
}
void is_float_test(const char *s) {
float x;
printf("Test(\"%s\"):\n", s ? s : "NULL");
if (is_float(s, &x)) {
printf("Good (float) %e\n", x);
} else {
puts("Bad (float)");
}
}
int main(void) {
// Test cases
is_float_test("123");
is_float_test(" 123");
is_float_test("123.456\n");
is_float_test("123 ");
is_float_test("123e123");
is_float_test("123e456");
is_float_test(" 123 xyz");
is_float_test(" abc");
is_float_test(" ");
is_float_test("");
// Chance for user input
char buffer[80];
is_float_test(fgets(buffer, sizeof buffer, stdin));
return 0;
}
输出
Test("123"):
Good (float) 1.230000e+02
Test(" 123"):
Good (float) 1.230000e+02
Test("123.456
"):
Good (float) 1.234560e+02
Test("123 "):
Good (float) 1.230000e+02
Test("123e123"):
Good (float) inf
Test("123e456"):
Good (float) inf
Test(" 123 xyz"):
Bad (float)
Test(" abc"):
Bad (float)
Test(" "):
Bad (float)
Test(""):
Bad (float)