2015-06-01 3 views
0

Я изучаю язык C из книги под названием «Язык программирования C» Брайана Кернигана & Деннис Ритчи и застрял на своем основном уроке программы подсчета строк. Программа работает, но не дает вывода о том, сколько строк было введено.Программа подсчета строк в C

Даны программный код ниже, пожалуйста, помогите на том же.

#include <stdio.h> 

void main() 
{ 
    int c, nl; 
    nl = 0; 
    while ((c = getchar()) != EOF) 
     if (c == '\n') 
      ++nl; 
    printf("%d \n", nl); 

    return 0; 
} 

Код должен считывать входные данные, а затем выводить количество строк текста. Как это изменить, чтобы заставить его работать?

+2

Вы должны работать над своим отступом и, возможно, использовать больше брекетов. Кроме того, как вы его запускали, какой вклад вы предоставили, и какой результат вы получили? – unwind

+0

Показать фактический код. Откуда вы его читаете? –

+1

'int main (void)'. Насколько хорошо вы следовали этому уроку? – Eregrith

ответ

2

Не было проблем с кодом; это хорошо работает, только проблема - она ​​принимала участие и не давала результата.

В окне ввода-вывода, , мы должны нажать Ctrl + Z, а затем клавишу Enter, чтобы отобразить количество строк на входе.

4

Ваша программа отлично работает. Тем не менее, я бы префикс 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, и он работает правильно.

Логика этой программы заключается в следующем:

  1. Сохранить текущий символ в качестве предыдущего символа.
  2. Получить следующий символ и сделать его текущим персонажем.
  3. Проверьте текущий символ, чтобы увидеть, является ли он символом новой строки.
  4. Если это так, то мы увеличиваем счетчик строк и перезапускаем цикл.
  5. Проверьте текущий символ, чтобы увидеть, является ли это EOF и предыдущим символом, если это символ новой строки.
  6. Если это так, то выйдите из цикла.
  7. Проверьте текущий символ, чтобы увидеть, является ли это EOF.
  8. Если это так, то увеличивайте счетчик строк и выходите из цикла.

Так вы имеете дело с окончательной строкой, которая не прерывается символом новой строки и по-прежнему учитывается как строка. Обратите внимание, что это считается особым случаем и должно быть явно закодировано. Если вы продолжите работу в области разработки программного обеспечения, то вы столкнетесь с особыми ситуационными ситуациями, и вам нужно закодировать обработку для каждого, с которым вы сталкиваетесь.

Надеюсь, это поможет.

1

Ваш код работает нормально. Я проверял его на Ubuntu.

Просто нажмите Ctrl + d, если вы работаете в Linux, чтобы завершить ввод.

+0

спасибо за ответ, я работаю в среде Windows – Vino

Смежные вопросы