2012-04-27 2 views
1

Я использую getchar(), чтобы читать символы и помещать их в таблицу, а также scanf, чтобы получить целое число.scanf получает вход ранее excecuted getchar()

Проблема с scanf() заключается в том, что он не ждет ввода пользователя, но считывает из буфера последний символ, указанный в предыдущей строке, с помощью getchar().

Я пробовал sscanf, fflush (stdin); и т. д., но я все еще придерживаюсь такого же поведения.

#include <stdio.h> 
#include <stdlib.h> 


main() 
{ 
    int i, choice, tmp_day, tmp_month; 
    char name[5]; 

    printf("insert choice(1-3):\n"); 
    scanf("%d",&choice); 


    printf("name: "); 
    for (i=0;i<5;i++) name[i]=getchar(); 

    name[5] = '\0' ; 

    printf("day (1-31): "); 

    scanf("%d",&tmp_day); 

    printf("month (1-12): "); 

    scanf("%d",&tmp_month); 

    printf("\n%d %d", tmp_day, tmp_month); 

} 

Любая идея?

Заранее спасибо.

+0

название ассоциации [5]; -> char name [6]; index 0..5 = size is 6 – BLUEPIXY

ответ

0

После каждого Scanf использовать это заявление:

fflush(stdin); 
+0

Вы имели в виду 'fflush (stdin);'? – Jack

+0

mea culpa, typo :) – Satya

+0

Не просто опечатка, неопределенное поведение тоже. –

1

Подробное обсуждение fflush(stdin), которые не обязательно портативный.

http://c-faq.com/stdio/gets_flush2.html 
+0

Спасибо, но этого недостаточно. Он предлагает fgets и sscanf, но все еще существует проблема с \ n характером fgets, который не потребляется. Итак, я, наконец, объединил это с обычным чистым буфером (который использует while ((c = getchar())! = '\ N' && c! = EOF)) – Chris

+0

Кажется, что лучшая комбинация - getline и sscanf. Как описано здесь http://crasseux.com/books/ctutorial/fgets.html, fgets устарел – Chris

+0

gets фактически больше не является частью стандарта C11. fgets() есть. Поэтому я подозреваю, что вы имели в виду, что убирается. Мне нравится думать, что это было объявлено вне закона. http://en.wikipedia.org/wiki/C_file_input/output –

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