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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2011, 18:57   #1
Nebojitel
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 26
По умолчанию Си програмка

Здравствуйте.
Начал разбираться в Си потихоньку и как обычно это водится в нашей литературе куча не работающих примеров кода. Подскажите что тут не так.
Подсчет символов.
Код:
#include <stdio.h>
int main()
{
  long nc;
  nc = 0;
  while (getchar() != EOF)
  ++nc;
  printf ("%ld\n", nc);
}
Компилил gcc. Ввожу, к примеру, 12345, на выходе должно получится 5. но ничего, 12345 Enter и ожидание нового ввода. Такое ощущение что из цикла она так и не вывалилась.

Последний раз редактировалось Stilet; 08.07.2011 в 20:18.
Nebojitel вне форума Ответить с цитированием
Старый 07.07.2011, 19:11   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вам надо ввести признак конца ввода. ENTER не является признаком конца ввода, а лишь означает, что буфер для ввода будет очищен для нового воода.
Обычно на PC признаком конца ввода является комбинация клавиш Ctrl+Z, после которой надо нажать ENTER.

Кроме того я хотел бы вашу программу подправить, чтобы вы с самого начал грамотно писали на С.
Правильным объявлением функции main на С является

int main( void )

Ключевое слово void обязательно, так как в С пустые скобки означает не отсутствие параметров, а то, что вы ничего не можете сказать о параметрах до тех пор, пока не встретите вызова функции.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Stilet; 08.07.2011 в 20:18.
Сыроежка вне форума Ответить с цитированием
Старый 07.07.2011, 22:16   #3
Nebojitel
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 26
По умолчанию

спасибо, учту про void. В данной программке EOF позиционируется как символ конца строки. Погуглил, не нашел определенного символа, ctrl+Z завершает выполнение программки. Программлю из под линукса. Пробовал ввесли какой нибудь символ как конец строки по типу

.....
S = 0;
while (getchar() != S)
....
к положительному результату не привело(((
Nebojitel вне форума Ответить с цитированием
Старый 08.07.2011, 11:44   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Код:
while (getchar() != '\n')
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 08.07.2011, 12:31   #5
Nebojitel
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 26
По умолчанию

Код:
#include <stdio.h>
	main(void) 
{
    long nc;

    nc = 0;
    while (getchar() != '\n')
    ++nc;
    printf("%ld\n", nc);

	//return 0;
}
Работат)) СПС

Последний раз редактировалось Stilet; 08.07.2011 в 20:19.
Nebojitel вне форума Ответить с цитированием
Старый 08.07.2011, 18:56   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Nebojitel Посмотреть сообщение
спасибо, учту про void. В данной программке EOF позиционируется как символ конца строки. Погуглил, не нашел определенного символа, ctrl+Z завершает выполнение программки. Программлю из под линукса. Пробовал ввесли какой нибудь символ как конец строки по типу

.....
S = 0;
while (getchar() != S)
....
к положительному результату не привело(((
Если мне память не изменяет, то в UNIX подобных системах используется для этих целей комбинация Ctrl+D.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 09.07.2011, 01:01   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от Сыроежка
в UNIX подобных системах используется для этих целей комбинация Ctrl+D
Ctrl + C вроде
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.07.2011, 11:54   #8
Nebojitel
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 26
По умолчанию

Ctrl+C, это выход из выполняемой программы. Ctrl+Z завершает программу только по-другому.
Nebojitel вне форума Ответить с цитированием
Старый 15.07.2011, 20:54   #9
mikillskegg
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 36
По умолчанию

если написать
Код:
while (getchar() != '\n')
то выход из цикла случится сразу после нажатия ENTER, поскольку именно тогда на терминал посылается символ \n.
надо
Код:
while (getchar() != EOF)
в юниксах символ EOF посылается CTRL+d.
CTRL+z приостановит процесс (процессу посылается сигнал SIGTSTP), CTRL+c прервет его (сигнал SIGINT).

и ещё.
указывать void в аргументах программы, если не собираешься их использовать, совсем не обязательно. А вот в конце main поставить return 0; - хороший стиль программирования. сразу к нему приучайся. напишешь рабочую программу, а вдруг кому-нибудь нужно будет проверить код ее завершения. а без return она вернет неизвестно что. Да и если скомпилировать с опцией -Wall (максимум предупреждений компилятора), то будет выведено warning.

Последний раз редактировалось mikillskegg; 15.07.2011 в 21:12.
mikillskegg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна програмка kir525 Фриланс 4 04.07.2011 19:14
Интересная програмка!! ToKS Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.05.2010 23:53
Програмка Spiderik Паскаль, Turbo Pascal, PascalABC.NET 1 17.04.2010 09:12
Програмка на Delphi Mougogblp Помощь студентам 3 01.11.2009 13:32
програмка на Делфи FCSM Помощь студентам 6 29.10.2009 21:56