Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задачка со scanf() printf()
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sigmaN
What is the differnce between the following function calls to scanf?(Please notice the space carefully in the second call. Try removing it and observe the behaviour of the program)

Код
#include <stdio.h>
  int main()
  {
      char c;
      scanf("%c",&c);
      printf("%c\n",c);

      scanf(" %c",&c);
      printf("%c\n",c);

      return 0;
  }
Почему без пробела не работает? blink.gif
Палыч
Цитата(sigmaN @ May 12 2010, 09:26) *
Почему без пробела не работает?
Это - вот тут, чтоли?
Код
      scanf(" %c",&c);
Так, пробел стоит в формате, вот он и требуется...
sigmaN
Вы не поняли.
Код
#include <stdio.h>
  int main()
  {
      char c;
      scanf("%c",&c);
      printf("%c\n",c);

      scanf(" %c",&c);
      printf("%c\n",c);

      return 0;
  }
input:1<enter>
output:1\n
input:2<enter>
output:2\n

Убираем пробел из формата чтобы было вот так
Код
#include <stdio.h>
  int main()
  {
      char c;
      scanf("%c",&c);
      printf("%c\n",c);

      scanf("%c",&c);
      printf("%c\n",c);

      return 0;
  }
input:1<enter>
output:1\n
больше inputа моего программа не ожидает. дважды проскакивает курсор(как-бы \n откудато) и всё.

Вот что я имел ввиду )))
Попробуйте, скомпильте.
Я думаю тут дело в том, что клавиша enter выдаёт сразу \r\n что-ли.
\r хавает scanf, а \n остаётся в буфере. Если следующий scanf без пробела - то этот \n залетает в char c; и тут же выводится(поэтому курсор проскакивает).
А если в формате есть пробел - этот лишний \n съедает пробел.. Только как такое может быть blink.gif
Да и enter вроде не должен два chara сразу выдавать... т.е. как-то непонятно до сих пор )
XVR
Первый scanf считывает из stdin ОДНУ букву, при этом '\n' остается в stdin. Если второй scanf записан без пробела, то этот '\n' считывается.
Пробел в формате scanf заставляет его пропустить пробельные символы (включая '\n')
Сергей Борщ
Цитата(sigmaN @ May 12 2010, 11:01) *
Я думаю тут дело в том, что клавиша enter выдаёт сразу \r\n что-ли.
Замените printf("%c" на printf("%02X " и легко проверите свое предположение.
sigmaN
Цитата
Первый scanf считывает из stdin ОДНУ букву, при этом '\n' остается в stdin. Если второй scanf записан без пробела, то этот '\n' считывается.
Пробел в формате scanf заставляет его пропустить пробельные символы (включая '\n')
ну в принципе так я и думал. Но всё равно интересный момент.
Вообще по указанному адресу много интересных программок. Неплохо развеивает уверенность в том, что ты знаешь Си smile.gif))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.