#c #buffer #inputstream #cout #cin
#c #буфер #входной поток #cout #cin
Вопрос:
Ранее я программист на C (хочу узнать больше о системном программировании, но не хочу переходить к сборке, поэтому я выбираю C), но позже в моем университете я должен взять C , мне действительно трудно использовать объект cin
and cout
, поскольку он имеет некоторые изменения по сравнению с моим доверенным макросом printf()
, scanf()
getchar()
в C. Вот код.
Код
int main(void)
{
using namespace std;
cout << "What is the number?nn";
cout << "#Number :";
cin >> num;
while(cin.fail())
{
cin.clear();
cin.ignore(1000 , 'n');
cout << "Please enter a numbernn";
cout << "#Number :";
cin >> num;
}
return 0;
}
Вопрос
1.) Я хочу, чтобы этот код запрашивал у пользователя число (меньше и больше или равное 0), когда пользователь вводит символ или строку, я хочу, чтобы он предупреждал пользователя об этом, очищал буфер ввода и повторно запрашивал у пользователя новое значение, пока оно не станет числом.
2.) Итак, я просто гуглю и нахожу страницу, проповедующую метод, поэтому я просто следую пути, но это не удалось. Я понятия не имею, почему, как только я запускаю этот код, введите символ, который приведет к бесконечному циклу вывода Please enter a number
.Любая ошибка, допущенная мной в этом коде??
Спасибо, что потратили время на чтение моей проблемы
P / S: Я использую CodeBlocks с компилятором MinGW.
Ответ №1:
Вы не говорите, как произошел сбой, поэтому трудно сказать, в чем ваша проблема. Тот факт, что вы никогда не объявляете num
, является одной из очевидных проблем. И это приведет к сбою, если вы также введете строку длиной более 1000 символов.
Более идиоматичным решением в C было бы читать ввод построчно, используя std::getline
, а затем с помощью std::istringstream
преобразовать строку в число.
Комментарии:
1. Хорошо, спасибо, в любом случае, в исходном коде я объявляю это 🙂 просто здесь я забыл добавить в строку
Ответ №2:
Стандартный способ использования форматирования ввода — внутри условной проверки самой операции. Кроме того, вы захотите прочитать всю строку и попытаться проанализировать ее, а не извлекать токен за токеном. Например. вот так:
int num;
for (bool success = false; !success; )
{
std::cout << "Please enter a number: ";
std::string line;
if (std::cin >> line)
{
std::istringstream iss(line);
if (iss >> num) success = true;
}
if (!success) { std::cout << "Error!n"; }
}
std::cout << "Thank you. You said: " << num << std::endl;
Не стесняйтесь добавлять дополнительные диагностические данные в ветку ошибок.