К сожалению, в C ++ нет переносимого способа ограничения количества вводимых символов. Но какая бы платформа вы не использовали, она будет обеспечивать некоторый механизм: например, в Windows найдите Консольные функции .
Если вы используете обычный старый ввод C ++ iostreams из cin
, неплохо будет прочитать исходный текст в std::string
, используя istream& getline(istream&, string&)
- это предотвратит переполнение буфера, потому что string
s resize как необходимо. (Ваш код, включающий getline(InputMain, 5, '\n')
, технически безопасен в том смысле, что он не будет читать более 5 символов в InputMain
, но этот код хрупок - если позже вы решите, что хотите 6 символов, вы можете легко забыть обновить свой вызов на malloc()
, что приводит к сбоям. Кроме того, вам необходимо запомнить free(InputMain)
. Но, как я уже сказал, используйте string
.)
Относительно анализа:
Независимо от того, читаете ли вы ввод в string
, используя getline(cin, str)
или какой-то специфичный для платформы код, как только он появится, вам нужно вывести его в виде числа. Здесь класс istringstream
полезен - он позволяет вам рассматривать существующий string
как поток для чтения, поэтому вы можете использовать форматированный оператор ввода >>
:
string str;
if (!getline(cin, str)) {
cerr << "Something went seriously wrong...\n";
}
istringstream iss(str);
int i;
iss >> i; // Extract an integer value from the stream that wraps str
if (!iss) {
// Extraction failed (or a more serious problem like EOF reached)
cerr << "Enter a number dammit!\n";
} else if (i < 1000 || i > 9999) {
cerr << "Out of range!\n";
} else {
// Process i
}
Если вы используете iostreams C ++, вы можете просто извлечь непосредственно из cin
вместо использования string
и istringstream
:
int i;
cin >> i; // Extract an integer value from cin
Однако это может иметь незначительные нежелательные эффекты; в частности, любые дополнительные символы в строке, набираемой пользователем (в частности, '\n'
, набираемый при нажатии клавиши Enter), останутся во входном буфере для чтения следующей операцией <<
. Часто это не имеет значения, но иногда это имеет значение: например, если вы наберете cin.get();
, ожидая, что это будет ждать нажатия клавиши, он не будет - он просто прочитает '\n'
(или первый нецифровый символ, введенный пользователем).