Ввод символа в числовой тип данных

238
24 апреля 2018, 03:32

Например, если я пытаюсь записать в int букву А, то программа падает. Можно ли как-то это отлавливать до того, как символ попадёт в переменную?

Можно конечно создать ещё один char и из него переводить в int. Есть ли другие способы?

Код:

while (true)
{
  int x,y;
  char Y;
    cout << "\nSelect X:";
    cin >> x;
    cout << "Select Y:";
    cin >> Y;
    y = (int)Y - 65;
    if (x > 9 || x < 0 || y>9 || y < 0)
    {
        cout << "Input error\n";
        continue;
    }
    if (comp[x][y] != 0&&comp[x][y]!='O')
    {
        cout << "Set failed\n";
        continue;
    }
    break;
}
Answer 1

С помощью cin вы не сможете присвоить инту символ, так как cin жден именно цифр, так что у вас в X Y остануться те же значения, что и были, а если вы позаботились о том, чтобы в них изначально не было мусора, то это будет 0 (ну или что вы там по дефолту поставили). Если уж хотите передовать символы, так сделайте X Y чарами, ну или воспользуйтесь сишной функцией scanf.

И да, если возьметесь вводить символы, то обязательно очищайте после ввода входной поток, так как \n - это тоже символ!!!

Answer 2

Ну вот вариант ввода для шахматной доски - буква и цифра:

string buf;
cin >> buf;
if (buf.length() != 2) { cerr << "Error!\n"; exit(1); }
int x = toupper(buf[0])-'A';
int y = buf[1] - '1';
// Проверки корректности ввода - например,
if (x < 0 || x > 7 || y < 0 || y > 7) { cerr << "Error!\n"; exit(1); }

Вводите как одно двухсимвольное слово.

Answer 3
#include <iostream>
#include <ctype.h>
using namespace std;
int main()
{    
    int n = 0;
    //cin.peek() это целочисленный тип текущего символа (int_type)
    while(!isdigit(char(cin.peek())))   
         cin.ignore();
    cin >> n;
    cout << n;    
    return 0;
}
Answer 4

Если попытаетесь ввести в x не int, cin перейдет в состояние fail. Проверить это можно с помощью

if(!cin)
 //Обработка ошибки
READ ALSO
MOUSEEVENTF_MOVE Некорректно перемещает мышь

MOUSEEVENTF_MOVE Некорректно перемещает мышь

Мне нужно программно нажать на ЛКМ в 1160, 800; Координаты я получил через свое приложение через CursorPosition на C#

286
Переменное число параметров в функции

Переменное число параметров в функции

Данный код работает некорректноОн должен выводить то количество параметров, что указано ему аргументом num, используя указатель на адрес...

258
Идентификатор не определен Win api C++ [требует правки]

Идентификатор не определен Win api C++ [требует правки]

Всё решил проблему, оказывается GWL_WNDPROC уже не используется вместо него теперь GWLP_WNDPROC

1002
Включение нескольких тестов в проект CMake

Включение нескольких тестов в проект CMake

Здравствуйте, не могу разобраться с тем как включить несколько тестов в проект, по одному все прекрасно работает, но а когда их несколько...

307