Ваша программа отлично работает. Тем не менее, я бы префикс main с типом int, чтобы компилятор был тихим. Он должен выглядеть следующим образом:
INT основной (аннулируются)
Когда вы это называете, что я сделал это:
$$$ ->./test6 < test4.c
19
$$$ ->wc test4.c
19 48 379 test4.c
$$$ ->
Функция GetChar это то же самое, как ЕОКП (стандартный ввод), поэтому, когда вы запускаете свою программу, она берет на себя вход с stdin (клавиатура) или файл, перенаправленный на stdin.
EDIT: если кто-то указал, если последняя строка не имеет \ n-терминатора, эта строка не будет считаться. Поэтому я переписал код, чтобы объяснить это:
#include <stdio.h>
int main(void)
{
int c; /* Character */
int cp; /* Previous Character */
int n; /* Number of lines */
n = 0;
c = 0;
while (1)
{
cp = c;
c = getchar();
if (c == '\n')
{
n++;
continue;
}
if (c == EOF && cp == '\n') break;
if (c == EOF)
{
n++;
break;
}
}
printf("%d \n", n);
return 0;
}
Как вы можете видеть в коде, я использовал падение, хотя логики либо продолжить цикл, или выйти из него. Теперь я тестировал этот код, используя clang на FreeBSD, и он работает правильно.
Логика этой программы заключается в следующем:
- Сохранить текущий символ в качестве предыдущего символа.
- Получить следующий символ и сделать его текущим персонажем.
- Проверьте текущий символ, чтобы увидеть, является ли он символом новой строки.
- Если это так, то мы увеличиваем счетчик строк и перезапускаем цикл.
- Проверьте текущий символ, чтобы увидеть, является ли это EOF и предыдущим символом, если это символ новой строки.
- Если это так, то выйдите из цикла.
- Проверьте текущий символ, чтобы увидеть, является ли это EOF.
- Если это так, то увеличивайте счетчик строк и выходите из цикла.
Так вы имеете дело с окончательной строкой, которая не прерывается символом новой строки и по-прежнему учитывается как строка. Обратите внимание, что это считается особым случаем и должно быть явно закодировано. Если вы продолжите работу в области разработки программного обеспечения, то вы столкнетесь с особыми ситуационными ситуациями, и вам нужно закодировать обработку для каждого, с которым вы сталкиваетесь.
Надеюсь, это поможет.
Вы должны работать над своим отступом и, возможно, использовать больше брекетов. Кроме того, как вы его запускали, какой вклад вы предоставили, и какой результат вы получили? – unwind
Показать фактический код. Откуда вы его читаете? –
'int main (void)'. Насколько хорошо вы следовали этому уроку? – Eregrith