如何检查用户输入是否是C中的浮点数?

时间:2015-11-10 02:09:25

标签: c

我正在尝试创建一个程序来检查用户输入的数字是否为浮点数,但它不起作用。我尝试使用QWebView进行检查,但这也无效。

scanf

2 个答案:

答案 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)