Как сделать проверку введения пользователем символов в C++ ?
У меня есть программа, которая должна вычислить деление чисел, которые должен ввести пользователь. Моя формула выглядит так: b / c = a. При этом, в программе присутствует посимвольная проверка пользовательского ввода через циклы. В моём случае это выглядит так:
#include <iostream>
#include <Windows.h>
#include <locale.h>
#include <cmath>
#include <cctype>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
SetConsoleCP(1251);
float a, b, c;
do {
cout << "Введите b: ";
cin >> b;
if ( cin.fail ()) {
cin.clear();
cin.ignore(10000, '\n');
cout << "Ошибка ! Введите b еще раз!" << endl;
continue;
}
if (b <= 0) {
cin.clear();
cin.ignore(10000, '\n');
cout << "Ошибка ! Число b должно быть больше нуля!" << endl;
continue;
}
break;
} while (true);
do {
cout << "Введите c: ";
cin >> c;
if ( cin.fail ()) {
cin.clear();
cin.ignore(10000, '\n');
cout << "Ошибка ! Введите c еще раз!" << endl;
continue;
}
if (c <= 0) {
cin.clear();
cin.ignore(10000, '\n');
cout << "Ошибка ! Число c должно быть больше нуля!" << endl;
continue;
}
break;
} while (true);
a = b/c;
cout<<"a = "<<a<<endl;
return 0;}
Как видно, у меня присутствует проверка, что если пользователь вводит числа, которые меньше или равны 0 (или же, это не числа а буквы), то программа выдаст ошибку и пользователь будет вынужден ввести данные ещё раз. Но здесь есть одна проблема.
Если ввести, например, .23(перед точкой не ввести какое-нибудь число) или 35щ56, то программа посчитает первое число как 0.23, а во втором случае программа учтёт только 35 (т.е. всё, что идет после щ и саму щ (на месте щ может быть любая буква, запятая, тире и другие символы, не относящиеся к числам)). А такого не должно быть, но я не знаю как такую проверку сделать.
Подскажите пожалуйста, как это исправить ?
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
bool isValidNumber(string str) {
bool point = false;
for (char& c : str) {
if (!isdigit(c)) {
if (c == '.' && !point) {
point = true;
} else {
return false;
}
}
}
return true;
}
int main() {
string input;
float b;
do {
cout << "Введите b: ";
cin >> input;
if (!isValidNumber(input)) {
cout << "Ошибка! Введите b еще раз!" << endl;
continue;
}
b = stof(input);
if (b <= 0) {
cout << "Ошибка! Число b должно быть больше нуля!" << endl;
continue;
}
break;
} while (true);
// Делайте то же самое для c
return 0;
}
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
bool not_strict_double(const string& line) {
istringstream iss(line);
double x;
string tail;
if (iss >> x) {
if (iss >> tail) return true;
return false;
}
return true;
}
double input_double(const string& msg = ""s) {
string line;
do {
cout << msg;
cin >> line;
} while (not_strict_double(line));
return stod(line);
}
int main() {
auto b = input_double("b: ");
auto c = 0.0;
do c = input_double("c: "); while (!c);
auto a = b / c;
cout << "a: " << a << '\n';
}
#include <iostream>
#include <sstream>
#include <string>
bool msg(int code)
{
switch (code)
{
case 1: std::cerr << "Negative num!"; break;
case 2: std::cerr << "Not a number!"; break;
case 3: std::cerr << "Division by zero?"; break;
}
return code;
}
float input(float rel = -1)
{
float x = -1;
int code;
std::string str;
do
{
code = 0;
std::cin >> str;
auto in = std::istringstream(str);
if (in.peek() == '-' && in.ignore()) code = 1;
if (in.peek() < '0' || in.peek() > '9')
{
code = 2; continue;
}
in >> x;
if (rel!=-1&&x == rel) code = 3;
if (!in.eof()) code = 2;
} while (msg(code));
return x;
}
int main()
{
std::cout << input()/input(0);
}