Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2016, 16:59   #1
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию Первые шаги в С

Добрый день. Делаю первые шаги в С. С позволения администрации, и, дабы не плодить тем, буду здесь спрашивать очевидные для всех, но непонятные для меня моменты и, возможно, глупости.

Моя первая программа (вместо хэлоуворлд):
Код:
#include <stdio.h>
int main()
{
    char c;
    while ((c=fgetc(stdin)) != EOF)
            printf("%c",c);
}
Компилирую и запускаю из под FreeBSD. Файл успешно компилируется в a.out и даже работает, но не так как я предполагал. Функция fgetc, по идее, возвращает символ, взятый из входного потока. В данном случае stdin.

Если программу запускать как "a.out > test", то вводимая информация окажется в файле test, как и предполагалось.

Но, если запустить программу просто как "a.out", то после каждой нажатой клавиши, сразу должен печататься символ через printf. На деле символ выводится, но не через printf, а как функия эха ОС (в первом случае редиректа в файл мы тоже видим что печатается). printf спит. Но стоит нажать Enter, как printf печатает сразу всю строку и снова засыпает до следующего Enter.

Другими словами, на получается так:
Код:
# ./a.out
123
123
456
456
Но, насколько я понимаю, должно быть так:
Код:
# ./a.out
112233

445566
Почему так происходит?
Sabre вне форума Ответить с цитированием
Старый 13.09.2016, 17:38   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что оно в stdin не попадет до этого.
Вы ж можете например нажать backspace и стереть символ, ввести другой и т.п. до нажатия Enter.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.09.2016, 19:08   #3
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Такой вариант:
Код:
#include <termios.h>
#include <unistd.h>
#include <stdio.h>

void rawInputEnable(int enabled){
	struct termios term;
	tcgetattr(STDIN_FILENO, &term);
	if(enabled){
		term.c_lflag &= ~(ICANON | ECHO);
	}else{
		term.c_lflag |= (ICANON | ECHO);
	}
	tcsetattr(STDIN_FILENO, TCSANOW, &term);
}




int main(void)
{
	char c;
	rawInputEnable(1);
	while ((c=fgetc(stdin)) != EOF)
		printf("%c",c);
	return 0;
}

Последний раз редактировалось Croessmah; 13.09.2016 в 19:26.
Croessmah вне форума Ответить с цитированием
Старый 14.09.2016, 12:55   #4
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Потому что оно в stdin не попадет до этого.
Вы ж можете например нажать backspace и стереть символ, ввести другой и т.п. до нажатия Enter.
Действительно. Вот спасибо, думал я чего-то в С недопонимаю, оказалось показалось

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Такой вариант:
Спасибо.
Sabre вне форума Ответить с цитированием
Старый 19.09.2016, 10:39   #5
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Вопрос по условию для if:
Код:
if (a==5 && b == 10)
     ;
else
    do_something();
Можно переделать как:
Код:
if (!(a==5 && b == 10))
    do_something();
Можно ли изначальное условие сделать красивее, чем в варианте 2?
Sabre вне форума Ответить с цитированием
Старый 19.09.2016, 10:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
if(a!=5 || b!=10)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2016, 10:50   #7
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Спасибо. Я так пробовал, но не поменял конъюнкцию на дизъюнкцию и что-то стало работать не так Надо мозг дрессировать на такие штучки
Sabre вне форума Ответить с цитированием
Старый 19.09.2016, 13:12   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

в обоих решениях классическая ошибка на проверку возвращаемого fgetc значения.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.09.2016, 13:21   #9
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
в обоих решениях классическая ошибка на проверку возвращаемого fgetc значения.
Если речь идёт о
Код:
while ((c=fgetc(stdin)) != EOF)
то я это уже переделал по нормальному:
Код:
for (c=fgetc(stdin); !feof(stdin); c=fgetc(stdin))
    ...

Последний раз редактировалось Sabre; 19.09.2016 в 13:25.
Sabre вне форума Ответить с цитированием
Старый 19.09.2016, 15:28   #10
RaisaR
 
Регистрация: 19.09.2016
Сообщений: 3
По умолчанию

Добрый день! Делаю самые первые шаги в программировании на С. Извините за глупый вопрос, но чем заменить функцию gets, которую не воспринимает среда программирования?

посоветуете литературу и/или другие источники, по которым можно изучить язык С?

Последний раз редактировалось RaisaR; 19.09.2016 в 15:30.
RaisaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
первые шаги в андройде Виталий.Ч . Помощь студентам 2 11.03.2016 16:19
Первые шаги к свободе 13th Свободное общение 15 19.01.2012 00:58
Первые шаги в QBasic teeshka2 Помощь студентам 2 23.08.2010 14:47
первые шаги в с++ ploik Общие вопросы C/C++ 2 16.07.2010 23:35
Первые шаги trave1er Общие вопросы C/C++ 2 10.09.2008 20:32