Как проверить, является ли пользовательский ввод плавающим числом в C?

Я пытаюсь создать программу, которая проверяет, является ли число, которое вводит номер, является float, но это не работает. Я попытался проверить с помощью scanf , но это тоже не сработало.

 #include  int main(void) { float num1; printf("enter number: "); scanf("%lf", &num1); if (scanf("%lf")) { printf("Good \n"); } else { printf("Bad \n"); } } 

Прочитали ли вы какую-либо документацию по 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  #include  #include  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"); } 

Лучший способ проверить, преобразуется ли строка в double – использовать strtod() .

strtod() может быть сложно использовать. С strtod(char *s, char *endptr) , если s == endptr , преобразование s == endptr неудачно. Еще раз проверьте строку, начинающуюся с endptr на endptr нарушения символов.

Проблемы с переполнением / streamом не рассматриваются здесь, кроме как сказать strtod() и преобразование в float будет легко конвертировать в нуль или бесконечность – оба они обычно представляются как float .

 #include  #include  #include  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)