Прочитайте консоль, а затем выведите no. линий

Я написал небольшой код, который должен читать строку ввода консоли и выдавать общий номер строки. Иногда он дает правильный вывод, а иногда - неправильный. Обычно неправильно, если 1 строка содержит только 1 символ, например:
а
б
с
д
Есть какая-то ошибка, но я не могу понять, что это такое. Я пробовал различные комбинации кода, отлаживал и просил кого-то еще (не это сообщество) посмотреть и помочь мне. Но все потерпели неудачу до сих пор. Если кто-то может указать, где я не прав и что сработает, буду очень благодарен.
Вот код:

#include<stdio.h>
int next_line(){
    int cnt=0;
    int ch;
    ch=getchar();
    while (ch!=EOF)
    {
        ch=getchar();
        cnt ++;
        if (ch ='\n')
        {
            break;
        }
    }
    if ((cnt > 0)||(ch ='\n'))
    {
       return 1;
    }
    else
    {
      return 0;
    } 
}
int read(){
    int lines=0;
    while (!feof(stdin))
    {
        next_line();
        lines += next_line();
    }
    return lines;
}
int main(){
    int n=0;
    n=read();
    printf("\n%d",n);
    return 0;
}

заранее спасибо

Пробовали использовать отладчик?

Scott Hunter 16.05.2022 17:01
почему while (!feof(stdin)) неправильно
Barmar 16.05.2022 17:02

Вы вызываете next_line() дважды в read(), но увеличиваете lines только от одного из них. Итак, вы считаете каждую вторую строку.

Barmar 16.05.2022 17:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы дважды вызываете свою функцию «next_line» в функции «чтения», поэтому вы считаете только каждую вторую строку. Как указывали другие, feof() ненадежен в этом случае использования. Рассмотрим следующую версию вашего кода:

#include <stdio.h>

int
next_line(void)
{
    int charcount = 0;
    char c;

    while ((c = getchar()) &&
           c != EOF) {
        if (c == '\n') {
            return 1;
        }
        continue;
    }

    return 0;
}

/* renamed from the generic 'read' to avoid naming
   conflicts */
int
count_lines(void) 
{
    int line_count = 0;

    while (next_line()) {
        line_count++;
    }

    return line_count;
}

int
main()
{
    int line_count = 0;
    line_count = count_lines();

    printf("counted %d lines\n", line_count);

    return 0;
}

Другие вопросы по теме