Функция scanf непонятно себя ведёт

Всем привет подскажите пожалуйста что не так с этим кодом:

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


int main(void) {

   printf("1 ");  // 1
   char t[100];
   scanf("%s", t);

   printf("2 "); // 2
   char c;
   scanf("%c", &c);

   printf("%s and %c", t, c);   // 3


   system("pause>nul");
   return 0;
   }

При консольном запуске программы, срабатывает только первая функция scanf. После ввода нескольких символов в t, и нажатии enter, программа запускает 2ую printf, затем будто пропускает инструкцию scanf("%c", &c); и выписывает 3 printf. Не понимаю в чём проблемма. Поясните пожалуйставведите сюда описание изображения


Ответы (1 шт):

Автор решения: Sergey

Не понимаю в чём проблемма.

Проблема в том, что функция scanf() осоуществляет ввод до символа перевода строки. Т.е., когда Вы вводите первую строку и нажимаете Enter, сама строка уходит в массив t, но в буфере ввода остаётся символ перевода строки '\n'. Когда выполняется второй оператор ввода, именно этот символ и ложится в переменную c. Сразу же.

Переделайте программу так:

#include <stdlib.h>


int main(void) {

   printf("1 ");  // 1
   char t[100];
   gets(t);

   printf("2 "); // 2
   char c;
   scanf("%c", &c);

   printf("'%s' and '%c'\n", t, c);   // 3


   return 0;
   }

тогда результат её выполнения будет таким:

$ ./a.out
1 qqqq
2 w
'qqqq' and 'w'

Сегодня использовать функцию gets() считается плохим тоном. Вместо неё надо использовать fgets(). Но разница между ними (в частности) в том, что gets() не береёт симовл переода строки из потока ввода, в fgets() - берёт.

→ Ссылка