2014-10-08 3 views
-4

Что происходит, когда я ввожу строку, когда scanf() ожидает float? Я думал, что это будет какое-то исключение, но я получил бесконечный цикл. Почему и как я могу это контролировать?Поведение scanf() в C++

Хорошо, код здесь

int main(){ 
    float f; 
    scanf("%f", &f); 
    cout << "f = " << f << endl; 
    return 0; 
} 
+0

Правильно ... можете ли вы показать код, пожалуйста, и спасибо – smac89

+0

Прочитайте данные в виде строки, а затем проверьте ввод, чтобы убедиться, что он численный, прежде чем пытаться разобрать его как поплавок. C++ не выполняет проверку входных данных. – AndyG

+0

Функция 'scanf' работает ТОЧНО так же, как и в C++, как и в C. Это также во многом означает' cin >> floatvar' wil. Это означает, что он будет читать «все, что он может есть», но если он встречает нечто «не то, что он ожидал», он перестанет читать и оставляет все, что не подходит в буфере. –

ответ

1

scanf читает столько, сколько он может, но он останавливается, если она попадает на конец ввода или если вход не соответствует спецификации. Он возвращает количество прочитанных элементов, и если оно было остановлено раньше, это число будет меньше числа спецификаторов в вашей строке формата, и любой вход, который не соответствует, все равно будет во входном буфере для будущего чтения.

.: например

Если вы int count = scanf("%f", &val) и вход «1,23», то val будет 1.23, count будет 1, а вход будет потребляться.

Если вы int count = scanf("%f", &val) и вход «Джордж», то val будет неизменным, count будет 0, и «Джордж» по-прежнему будет ждать на стандартный ввод для другого чтения использовать.

Вы можете обнаружить сбой, сравнив count с количеством вещей, которые вы пытались прочитать, и если он слишком низок, то каким-то образом восстановите или отбросьте ввод и ошибку.

+0

большое вам спасибо! – Absolut

Смежные вопросы