Проверка строки на вещественное число - C (СИ)
Формулировка задачи:
Все готово, теперь нужно куда-нибудь запихнуть условие, если число будет не только вещественным, но и отрицательным. Подскажите куда его вписать?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main() {
char s[80], *p;
int i;
//Поиск точки в числе
while (1) {
printf("Vvedite veshestvennoe chislo\n");
scanf("%s", s);
p = strchr(s, '.');
int wasError = 0;
for (i = 0; i < strlen(s); i++) {
if (s[i] != '.' && (s[i] < '0' || s[i] > '9')) {
printf("Ne chislo\n");
wasError = 1;
break;
}
}
if (wasError) // была буква
continue;
// точки нет ИЛИ точка в начале ИЛИ точка в конце ИЛИ > 1 точки
if (p == NULL || p == s || p == s + strlen(s) - 1 || strchr(p + 1, '.') != NULL) {
printf("Chislo ne veshestvennoe\n");
}
else {
printf("Chislo veshestvennoe\n");
break;
}
}
return 0;
}Решение задачи: «Проверка строки на вещественное число»
textual
Листинг программы
char s[80];
int i, wasError;
setlocale(LC_ALL,"Rus");
do
{
printf("Введите вещественное число: ");
scanf("%s", s);
for (wasError = i = 0; i<strlen(s) && !wasError; i++)
wasError=s[i]=='-' && i ||
s[i]!='-' && s[i] != '.' && (s[i]<'0' || s[i]>'9');
}while(wasError);
printf("%lf\n",atof(s));
Объяснение кода листинга программы
- Объявлены две переменные:
sтипаcharиiтипаint. Значение переменнойsбудет использоваться как строка для ввода числа, а переменнаяiбудет использоваться для подсчета количества символов в этой строке. - Установлена локальная настройка на русский язык с помощью функции
setlocale. - Запускается бесконечный цикл
do-while, который будет выполняться до тех пор, пока не будет введено корректное вещественное число. - В начале цикла выводится приглашение для ввода вещественного числа.
- С помощью функции
scanfвведенная строка сохраняется в переменнойs. - Переменная
wasErrorинициализируется значением0, а переменнаяiинициализируется значением0. - В цикле
forпроисходит проверка корректности введенной строки. Если найден дефис, иiменьше значенияstrlen(s), то значениеwasErrorне изменяется. Если найден символ, который не является дефисом, числом или точкой, иiменьше значенияstrlen(s), то значениеwasErrorустанавливается в1. Еслиiдостигает значенияstrlen(s), то цикл завершается. - После выхода из цикла
for, если значениеwasErrorравно0, то введенное число преобразуется в типdoubleс помощью функцииatofи выводится на экран. - Если значение
wasErrorне равно0, то цикл продолжается.