Обнаружение char, когда int требуется от cin

Пока я учусь в школе и изучаю C ++, это не вопрос домашнего задания, а странность, с которой я столкнулся, и мне интересно, как решить для себя и будущие рекомендации.

В поисках я не увидел ничего, что, казалось бы, имело непосредственное отношение к этому.

Поэтому я ищу ввод типа int, но при запуске программы я заметил, что если получен ввод символа (не уверен насчет строки), он преобразуется в int (я читал в своем учебнике, что это нормальное поведение C ++) ,

Мой вопрос: как мне проверить тип char на входе, поскольку он автоматически преобразуется в int? Я привык к Python, Ruby, PHP и т. Д., Где обычно есть несколько стандартных библиотечных методов для этого, но при поиске здесь и в гугле, похоже, нет. Ниже приведена урезанная версия того, что я использовал, когда обнаружил эту проблему.

Мне также интересно: откуда C ++ получает значение для char? Это значение ASCII или что-то еще? Если вы запустите приведенный ниже код и введете любой отдельный символ алфавита, вы поймете, о чем я говорю.

Я видел некоторые решения, которые включали внешние библиотеки, но надеялись, что в стандартной библиотеке / дистрибутиве C ++ есть что-то, с чем можно было бы поработать.

Если это связано: моя система OS X 10.8 и работает gcc.

Спасибо!

#include<iostream>
using namespace std;

int main()
{
int user_input;
int n;

cout << "Enter a number: ";
cin >> user_input;

for (n = 0; n < user_input; n++)
{
cout << n << endl;
}

cout << user_input << endl;

return 0;
}

0

Решение

как проверить тип char на входе

Есть несколько механизмов для использования. Вы могли бы рассмотреть эти 2:


Стиль 1.
Стиль ‘c’ будет проверять каждый входной символ с помощью isdigit ().
считывать вводимые пользователем данные в строку, проверять, является ли каждый символ цифрой и т. д.

std::cout << "Enter a number: ";
std::string user_input;
std::cin >> user_input;
for (int i=0; i<user_int.size(); i++
if (!isdigit(user_input[i])
throw "not a digit";
// if you get here, all the chars in user_input are digits,
// I suppose you might use atoi()  to convert, but see next.

Обратите внимание — есть также шестнадцатеричная проверка isxdigit (). И если вы хотите разрешить пользователю вводить запятые или пробелы, вы можете использовать user_input.erase (…) для каждого отдельного символа, который вы хотите разрешить пользователю использовать, но игнорировать как часть числа.


Стиль 2.

Вы можете предпочесть стиль c ++, который я считаю более простым, но требует освоения с методами C ++ std :: string.

std::cout << "Enter a number: ";
std::string user_input;
std::cin >> user_input;
const char* DIGITS = "0123456789";
size_t notaDigit = user_input.find_first_not_of(DIGITS);
if(notaDigit != std::string::npos)
throw "non-digit char found in user_input";

// if you get here, all chars are digits, so convert to integer.
// these days, I would do this in 4 steps.
int user_int = 0;
{
std::stringstream ss;
ss << user_input; // put char string into ss
ss >> user_int;   // extract and convert to integer
} // discard and cleanup the stringstream at scope end

std::cout << "user_int: " << user_int << std::endl;

если получен ввод символа (не уверен насчет строки), то это
преобразован в int

К вашему сведению — я не смог воспроизвести это на gcc 4.8.1 на ubuntu 12.04.

Символьные вводы через std :: cin не конвертируются в int.

Попытка преобразования останавливает преобразование цифры в часть целого числа на первом нецифровом символе. Таким образом, 33Y преобразуется в 33, потому что он прекратил преобразование в Y.
Вход ABC (или вход AB, или вход A) прекратит преобразование на первом (нецифровом) символе, таким образом, преобразование сообщает 0.

Я считаю, что определенные попытки преобразования (из строки в POD) также могут устанавливать флаги на istream, но не проверяют.

Примеры:

 dmoen@C5:~/cvs-tools/lmbm/src_ut$ ./dmy24
Enter a number: 12
0
1
2
3
4
5
6
7
8
9
10
11
12
dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
Enter a number: a
0
dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
Enter a number: bcd
0
dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
Enter a number: ABC
0

Обратите внимание, что большинство функций в стиле C автоматически превращают символ в int. Например, входные данные для isdigit () объявляются как int, поэтому продвижение упрощает их использование.

C ++ также поддерживает это продвижение, но я думаю, это не то, что вы видели.

1

Другие решения

Вы должны проверить наличие неудачных кинов:

....
cin >> user_input;
if (cin.fail())
cout << "Please enter numbers only" << endl;
else
{ // REST of your code }

AFAIK эти значения являются произвольными и не соответствуют значениям ASCII или чему-либо еще.

1

Попробуйте прочитать user_input как строку c и преобразовать ее в int с помощью atoi.

Это должно помочь.

0
По вопросам рекламы [email protected]