Однажды я спрашивал здесь по поводу "защиты от дураков" в С, мне ответили, что там её нет как таковой. Но лабораторные мне писАть надо, так что пока у нас вводятся только числа я попробовал, сделать вот такую проверку:
Код:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define MAXLINE 1000
double protect_double(char str[]){ // функция "защита от дураков"
int i; // переменная-счётчик
double digit; // возвращаемое значение
char str_2[MAXLINE]; // временная строка
for(i=0; i<strlen(str); i++){ // цикл проверки каждого введённого символа
if ((str[i]>='0'&&str[i]<='9')||(str[i]=='.')){ // определение принадлежности символа к числу или .
str_2[i]=str[i]; // если это число, то записываем в переменную строку
}
else { // если это не число, то выдаём сообщение об ошибке
printf("Вы ввели некорректные данные! Пожалуйста введите число."); // сообщение
break; // прерываем выполнение функции
}
}
if(i==strlen(str)){ // если все введённые символы - числа, то преобразуем строку в число
digit=atof(str_2); // преобразуем...
}
return digit; // возвращаем число
}
int main(void){
char s[MAXLINE]; // объявление вводимой строки
double a; // строка как число
printf("Введите пожалуйста число: \n"); // сообщение о вводе числа (на самом деле строки)
scanf("%s", &s); // сканируем вводимую строку
a=protect_double(s); // отправляем строку на проверку
printf("%f+1=%f\n", a, a+1); // выводим результат сложения, чтобы убедиться, что получили число
return 0; // завершение программы
}
всё бы ничего, но вот возникла проблема, которую я не знаю как решить:
функция protect_double должна возвращать занчение типа double, но какое значение она должна возвращать, если она завершилась, но не преобразовала строку (т.е. ввели не число)?
Как я понимаю, нужно в ней вместо break написать return <что-то>, что означало бы, что в строке не число, но ведь это <что-то> должно быть double. а как тогда в main отличить double, который с ошибкой от double, который ввели?