реклама на сайте
подробности

 
 
> Задачка со scanf() printf(), взято с http://www.gowrikumar.com/c/
sigmaN
сообщение May 12 2010, 05:26
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Палыч
сообщение May 12 2010, 05:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(sigmaN @ May 12 2010, 09:26) *
Почему без пробела не работает?
Это - вот тут, чтоли?
Код
      scanf(" %c",&c);
Так, пробел стоит в формате, вот он и требуется...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение May 12 2010, 08:01
Сообщение #3


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Вы не поняли.
Код
#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 сразу выдавать... т.е. как-то непонятно до сих пор )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
XVR
сообщение May 12 2010, 08:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Первый scanf считывает из stdin ОДНУ букву, при этом '\n' остается в stdin. Если второй scanf записан без пробела, то этот '\n' считывается.
Пробел в формате scanf заставляет его пропустить пробельные символы (включая '\n')
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 12 2010, 08:32
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sigmaN @ May 12 2010, 11:01) *
Я думаю тут дело в том, что клавиша enter выдаёт сразу \r\n что-ли.
Замените printf("%c" на printf("%02X " и легко проверите свое предположение.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение May 12 2010, 08:36
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Первый scanf считывает из stdin ОДНУ букву, при этом '\n' остается в stdin. Если второй scanf записан без пробела, то этот '\n' считывается.
Пробел в формате scanf заставляет его пропустить пробельные символы (включая '\n')
ну в принципе так я и думал. Но всё равно интересный момент.
Вообще по указанному адресу много интересных программок. Неплохо развеивает уверенность в том, что ты знаешь Си smile.gif))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 01:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.0132 секунд с 7
ELECTRONIX ©2004-2016