Top.Mail.Ru
Ответы

Как сделать проверку введения пользователем символов в 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 (т.е. всё, что идет после щ и саму щ (на месте щ может быть любая буква, запятая, тире и другие символы, не относящиеся к числам)). А такого не должно быть, но я не знаю как такую проверку сделать.
Подскажите пожалуйста, как это исправить ?

По дате
По рейтингу
Аватар пользователя
Новичок
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
 #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; 
} 
 
Аватар пользователя
Высший разум
12345678910111213141516171819202122232425262728293031323334
 #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'; 
} 
Аватар пользователя
Гений
1234567891011121314151617181920212223242526272829303132333435363738394041
 #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); 
}