Нужен пользователь для ввода строки / проверки длины строки (C ++) - PullRequest
1 голос
/ 17 апреля 2009

Мне нужно принять строку из 5 цифр от пользователя (только 5). Должен ли я использовать

istringstream 

за то же самое?

Разве я не могу сойти с рук с чем-то вроде этого?

int main()
{
    char *InputMain;
    InputMain=(char *)malloc(5+1);
    cout << "Enter the number : " <<endl;
    cin.getline ( InputMain, 5, '\n' );              // Input goes into InputMain
    cout << "The number entered is : " << InputMain <<endl;
    cin.get();
}

Затем идет следующая часть ..

Как убедиться, что пользователь вводит только 5 символов? И, возможно, если пользователь вводит более 5 символов, я должен отобразить предупреждение о том, что разрешено использовать только 5 символов.

Еще один вопрос, поскольку по сути это строка, мне нужно будет проверить, чтобы входные данные были только числами, анализируя каждый символ в строке и проверяя соответствующие значения ASCII (для чисел). правильно?

1 Ответ

4 голосов
/ 17 апреля 2009

К сожалению, в 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' (или первый нецифровый символ, введенный пользователем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...