Пока я учусь в школе и изучаю 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;
}
как проверить тип 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 ++ также поддерживает это продвижение, но я думаю, это не то, что вы видели.
Вы должны проверить наличие неудачных кинов:
....
cin >> user_input;
if (cin.fail())
cout << "Please enter numbers only" << endl;
else
{ // REST of your code }
AFAIK эти значения являются произвольными и не соответствуют значениям ASCII или чему-либо еще.
Попробуйте прочитать user_input как строку c и преобразовать ее в int с помощью atoi.
Это должно помочь.