Написание программы на c, которая читает из stdin и печатает в stdout без встроенного ограничения длины строки - PullRequest
0 голосов
/ 06 апреля 2019

Я читаю книгу «Указатели Кеннета Рика о Си» и наткнулся на следующий вопрос:

Напишите программу, которая читает строки из стандартного ввода. Каждая строка напечатана на стандартному выводу предшествует его номер строки. Попробуйте написать программу так, чтобы он не имеет встроенного ограничения на длину строки.

Чего я не мог понять, так это как сделать это без использования буфера для хранения ввода перед передачей его в качестве вывода.

Я пытался использовать стандартные функции для операций ввода-вывода, такие как fgets или scanf, но все они, похоже, нуждаются в переменной назначения для хранения ввода, прежде чем его можно будет передать в функцию printf.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Как указывает Taegyung , простой метод:

int c;
int LineNumber = 1;
printf("%d ", LineNumber);
while ((c = getchar()) != EOF)
{
    putchar(c);
    if (c == '\n')
        ++LineNumber;
}

Одна из проблем заключается в том, что будет напечатан номер строки для последней «пустой» строки.Если мы хотим избежать этого, то мы хотим печатать номер строки только в том случае, если (а) мы только что начали новую строку и (б) в файле есть другой символ:

#include <stdbool.h>
…

int c;
int LineNumber = 0;
bool AtStartOfLine = true;
while ((c = getchar()) != EOF)
{
    if (AtStartOfLine)
        printf("%d ", ++LineNumber);
    putchar(c);
    AtStartOfLine = c == '\n';
}
0 голосов
/ 06 апреля 2019

В итоге я написал следующий код:

#include <stdio.h>
#include <stdbool.h>

int main() {    
    int ch;
    int line_number = 0;
    bool found_newline = true;  

    while ((ch = getchar()) != EOF) {       
        if (found_newline) 
            printf("%d ", ++line_number);
        putchar(ch);        
        found_newline = ch == '\n';
    }
    return 0;
}

просто разместив его здесь для всех, кто может увидеть его в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...