2009-12-20 3 views
2

По соображениям самосовершенствования/расширения моих горизонтов я решил изучить некоторые из основ C, используя K R 'C Programming Language Book'.Начало работы с C с использованием K & R C Язык программирования программирования

Я выполнял упражнения, используя Bloodhsed DEV C++ 4.9.9.2 в качестве моей IDE.

я наткнулся на следующее упражнение - подсчета символов в входе:

main() 
{ 
    double nc; 
    for(nc = 0; getchar() != EOF; ++nc); 
    printf("&.0f\n", nc); 
} 

Этот код соответствует и работает без ошибок.

Однако, когда я ввожу строку в окне консоли и нажимаю enter, я не получаю никакого вывода, то есть числа, которое показывает, сколько символов в строке. Например, если я нахожу «test» в окне консоли, я ожидаю, что 4 появится как вывод.

Уверен, проблема в том, как я настроил свою среду IDE? Или я пропущу что-то более фундаментальное?

Любая помощь очень ценится. Придя с фона VB, я очень рад изучению другого языка, такого как C, и справиться с указателями!

Редактировать

Связанный ответ на мой вопрос также дается здесь и очень полезно: Why doesn't getchar() recognise return as EOF on the console?

+0

С простыми программами, как это, если они не работают в первый раз, просто перепечатывать все это. Очень сложно увидеть опечатки, когда вы не знаете, что ищете. – Skilldrick

+0

Вы должны знать, что DevC++ не работает и больше не разрабатывается. Если вам нужна хорошая, бесплатная, современная среда разработки для Windows, попробуйте Code :: Blocks на http://www.codeblocks.org – 2009-12-20 11:50:04

+0

или Visual Studio Express. Или MinGW. Или Cygwin. – paxdiablo

ответ

10

Вы не получите никакого вывода, пока стандартный входной поток не будет закрыт (либо CTRLZ под Windows или CTRLD под различными вариантами UNIX).

Новая линия - это еще один символ.

Возможно, вы также захотите получить более новую учебную книгу C. не main() уже не один из утвержденных основных прототипов ISO C, вы должны использовать один из:

int main(void) {} 
int main(int argc, char *argv[]) {} 

Кроме того, ваш код, как показано не скомпилируется, так как вы не расторгнуть printf формат. Использование:

printf("%.0f\n", nc); 

вместо:

printf("&.0f\n, nc); 

Почему вы используете double тоже загадка, если вы не хотите обрабатывать очень большие файлы - я бы с помощью int или long для что.

Вот код, который я буду использовать:

#include <stdio.h> 
int main (void) { 
    long nc; 
    for (nc = 0; getchar() != EOF; ++nc) 
     ; 
    printf("%ld\n", nc); 
    return 0; 
} 

порождающий следующую сессию:

pax> countchars 
Hello there.<ENTER> 
My name is Bob.<ENTER> 
<CTRL-D> 
29 

pax> 
+0

@paxdiablo - Фантастическая помощь! Я исправил опечатку в моей строке printf, и CTRL Z работает для меня. Кроме того, я согласен, что использование double не требуется, и int или long будет достаточно (этот момент сделан в K & R). –

+0

@paxdiablo - Могу ли я получить ваш совет, пожалуйста? Вы упомянули о получении более поздней учебной книги C, поскольку main() больше не является утвержденным прототипом для ISO C. Я хочу больше узнать, как «академическое» упражнение (например, что такое указатели и т. Д.), А не строить программы для решения реальных мировых проблем. В этом случае K & R удовлетворит эту цель? –

+0

Конечно, вы можете узнать основы K & R, это не проблема. Я думаю, что было бы лучше * выучить язык в соответствии со стандартом, но это ни в коем случае не обязательно *. Запустите с K & R немного и измените, только если вы начнете находить слишком много расхождений. – paxdiablo

1

Заменить:

printf("&.0f\n, nc); 

в

printf("%.0f\n", nc); 
0

Код, который вы указали правильно, но кажется, что он не работает. В моем случае он также не работал, поэтому я просто заменил EOF на «\ n», и он работал для меня, но только для одной строки, так как после нажатия ввода он дает выход и программу. Вы можете найти полный код ниже:

#include <stdio.h> 
/* Count characters in input; version 2*/ 

int main(void) 
{ 
    double nc; 
    for (nc = 0; getchar() != '\n'; ++nc); 
    printf("%.0f \n", nc); 
    return 0; 
} 
Смежные вопросы