2015-10-23 3 views
1

Так мне нужен ввод данные пользователя для междунар быть больше 2.Проверка пользовательского ввода в C

printf("Number of triangles (must be greater than 2) = "); 
    fflush(stdin); 
    scanf("%d", &num_of_triangles); 
    while (num_of_triangles < 3) // ?how to check using scanf? 
    { 
     printf("Number of triangles (must be greater than 2) = "); 
     fflush(stdin); 
     scanf("%d", &num_of_triangles); 
    } 

Есть ли возможность оптимизировать этот код в отношении повторяющихся строк?

+5

'fflush (stdin)' - неопределенное поведение. – Magisch

+0

Пожалуйста, напишите полный пример. – skypjack

ответ

3

Вместо while, do ... while. Таким образом, цикл будет выполняться хотя бы один раз.

num_of_triangles = 0; 
do { 
    printf("Number of triangles (must be greater than 2) = "); 
    scanf("%d", &num_of_triangles); 
    while (getchar() != '\n'); // this flushes the input buffer 
} while (num_of_triangles < 3); 

Кроме того, не fflush(stdin), так как это неопределенное поведение.

EDIT:

кажется, что Visual Studio позволяет fflush(stdin). От MSDN:

Функция fflush смывает поток. Если файл, связанный с потоком , открыт для вывода, fflush записывает в этот файл содержимое буфера, связанного с потоком. Если поток открыт для ввода , fflush очищает содержимое буфера. fflush отрицает эффект любого предшествующего вызова для отказа от потока. Кроме того, fflush (NULL) очищает все потоки, открытые для вывода. Поток остается открытым после вызова . fflush не влияет на небуферизованный поток.

В целом, однако, на это нельзя влиять. Предпочтительнее делать что-то более портативное, например, вышеуказанный код.

+0

Мы работаем в Visual Studio, и наш учитель рекомендовал использовать fflush (stdin) перед scanf(); , Как заменить это? – Lorant

+5

@Lorant Вы должны заменить учителя. :) – unwind

+0

@Lorant Смотрите мое редактирование. – dbush

1

fflush(stdin) - это неопределенное поведение, поэтому вам нужно полностью удалить его и заменить что-то еще.

Вы также должны проверить выходы scanf, в случае его отказа.

Если вы хотите, чтобы улучшить читаемость, вы также можете переместить scanf в свое время цикл непосредственно, как этот

while (scanf("%d",&num_of_triangles)==1 && num_of_triangles < 3) 
+0

Требование «неопределенного поведения» требует некоторой квалификации: http://en.cppreference.com/w/c/io/fflush (найдите «Примечания»). – sehe

0

Вы можете написать свой код, так как это -

printf("Number of triangles (must be greater than 2) = "); 

while (scanf("%d",&num_of_triangles)==1 && num_of_triangles < 3) //check return of scanf as well as number 
{ 
    printf("Number of triangles (must be greater than 2) = ");  
} 

Loop будет перебирать до scanf является успешным и num_of_triangles составляет менее 3.

+1

Не было бы (scanf ("% d", & num_of_triangles)! = 1 || num_of_triangles <3) лучше? – Lorant

+0

@Lorant Это даст вам бесконечный цикл ввода символов. – ameyCU

+0

@CoolGuy Извините, но я не получаю бесконечный цикл с символьным вводом. – ameyCU

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