2017-01-26 11 views
4

я получил этот кусок кодаC Printf обыкновение печати перед тем просмотрит следующий номер

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

int main() 
{ 
    int i; 
    int number, S; 
    float MO; 


    S = 0; 

    for(i=0;i<10;i++) 
    { 
    printf("AAA %d\n", i); 
    scanf("%d\n", &number); 
    S = S + number; 
    } 

    MO = S/10; 

    printf("%d , %f \n",S , MO); 
    return 0; 
} 

, когда начинается выполнение, AAA 0 printed.I затем дать свой первый number.After, что я ожидал увидеть AAA 1, но это будет напечатано только после того, как я дам свой второй номер. Проверено это здесь

C/C++ printf() before scanf() issue

но, кажется, я могу получить ни одно из этих решений не работает для меня

+5

'scanf ("% d \ n ", & number);' -> 'scanf ("% d ", & number);' –

+0

Действительно, это решило проблему. Не знаю, как выбрать этот комментарий как ответ. – user7375077

+0

@MichaelWalz, вы можете добавить это как ответ. – Gerhardh

ответ

4

Ответы, в которых утверждается, что это что-то связано с промывкой ввода или вывода, являются неправильными. Проблема не имеет к этому никакого отношения. Внешний вид символа \n в конце строки шаблона scanf() указывает scanf() на соответствие и отбрасывание пробельных символов. Он будет делать это до тех пор, пока не встретится символ без пробелов или не будет достигнут конец файла. Соответствующая часть C11 стандарта является §7.21.6.2 5:

директива состоит из белого символа пробела (ов) выполняется чтения входных данных до первого небелого-символа пробела (который остается ) или пока не будет прочитано больше символов. Директива никогда не сбрасывается .

В случае с OP второе число должно быть помещено во входной поток, чтобы можно было назначить первый. Второе число затем остается во входном потоке до следующего вызова scanf(). В случае примера, приведенного Стефаном Лехнером (Stephan Lechner), принимающим входные данные из файла, во входном потоке после каждого присваиваемого номера есть число, до последнего номера (если имеется ровно десять чисел), а затем EOF вызывает scanf() для возврата. Обратите внимание, что OP также может сигнализировать EOF с клавиатуры после каждого входа. Или, OP может ввести все цифры на одной строке, с дополнительным номером, чтобы сигнализировать конец ввода:

1 2 3 4 5 6 7 8 9 10 11 

Решение просто удалить \n с конца строки scanf() шаблона. Пробельные символы в конце такой строки шаблона сложны и почти никогда не желательны.

0

Этот вопрос с буферизацией stdout, который не заставит флеша, если только \n не находится в выход или fflush называется специально

+0

Оба 'printf' имеют '\ n'. Проблема OP не связана с буферизацией 'stdout'. – user3386109

+0

Проблема в этом случае - буферизация ОС - ergo часть fflush ответа – levengli

+2

Нет, проблема заключается в '\ n' в' scanf'. Проблема не имеет ничего общего с буферизацией ОС или 'stdout' или' fflush'. – user3386109

3

Просто удалите \n из формата scanf строки:

scanf("%d", &number); 
+1

Почему это необходимо? Если он нажмет Return после номера, не соответствует ли строка формата? – Barmar

+1

@Barmar Нет, '\ n' будет соответствовать любому количеству пробелов после номера. Таким образом, он может соответствовать одной новой строке или сто (и любому количеству пробелов или вкладок). 'Scanf' не вернется, пока не увидит хотя бы один символ без пробелов. И он не увидит этот символ без пробелов, пока вы не наберете символ без пробелов и не нажмете enter. – user3386109

+2

Это должно быть объяснено в ответе. – Barmar

3

"\n" ждет небелого помещения. Вместо этого используйте scanf("%d", &number)@Michael Walz и проверьте его возвращаемое значение.

Разобьем scanf("%d\n", &number);

  1. "%d" Scan для числового текста. Этот спецификатор позволит вести белый пробел. После обнаружения некоторого нечислового символа верните этот символ в stdin. Если был найден действительный числовой текст для целого числа, преобразуйте его в int и сохраните до number.

  2. "\n" Сканирование и отбрасывать 0 или более белые-пространства, такие как '\n', ' ' и другие. Продолжить сканирование до тех пор, пока не встретится небелое пространство, верните этот символ в stdin.

Теперь верните количество полей, отсканированных (1).


шаг Примечание 2. Пользователь должен ввести данные после Return или '\n' получить scanf() вернуться.

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

  • Нет связанных вопросов^_^