печать номера строки в c с использованием getchar и putchar

есть ли способ распечатать номер строки в C, используя только putchar и getchar и без массивов?

вывод должен выглядеть так. например введите mink

01: mink
02: jaguar 

и так далее

Номер строки должен быть от 01 до 50.

Это мой стартовый подход

#include <stdio.h>

int main() {
    int c;
    int counter = 1;

    while ((c = getchar()) != EOF) {
        putchar(c);
        if (c == '\n') {
            putchar(counter + '0');
            putchar(':');
            putchar(' ');
            ++counter;
        }
    }
    return 0;
}

person Community    schedule 08.05.2018    source источник


Ответы (2)


Предполагая, что номер строки состоит только из двух цифр, вычислите и выведите эти цифры и префикс :. Чтобы избежать дублирования кода в начале файла и не печатать номер строки для несуществующей строки после конца файла, печатайте номер строки перед первым символом каждой строки, то есть после новая строка, если есть другой символ. Инициализация lastc на '\n' гарантирует, что номер строки будет напечатан перед первой строкой файла, если есть хотя бы одна строка.

Вот простая реализация:

#include <stdio.h>

int main() {
    int c, lastc = '\n';
    int counter = 1;

    while ((c = getchar()) != EOF) {
        if (lastc == '\n') {
            putchar('0' + counter / 10 % 10); // tenths digit
            putchar('0' + counter % 10);      // units digit
            putchar(':');
            putchar(' ');
            counter++;
        }
        putchar(c);
        lastc = c;
    }
    return 0;
}
person chqrlie    schedule 08.05.2018
comment
Спасибо за ваш комментарий, но мне не разрешено использовать print f - person ; 08.05.2018
comment
Извините, я упустил из виду тот факт, что вы не можете использовать printf для вывода номера строки. Если вы можете предположить, что номер строки находится между 1 и 99, это довольно просто: в начале каждой строки вычислите и выведите 2 цифры и : . - person chqrlie; 08.05.2018
comment
Большое спасибо :) извините, английский не мой первый язык, но что именно вы подразумеваете под тем, что в начале каждой строки вычислить и вывести 2 цифры и : у меня проблемы с пониманием и что означает lastc = c; делать? - person ; 08.05.2018
comment
Я хочу, чтобы программа напечатала номера строк от 01 до 99, после чего она должна распечатать вывод без номеров строк, какой подход мне следует использовать? - person ; 09.05.2018
comment
Добавьте тест, чтобы выводить только номер строки, если counter < 100 - person chqrlie; 09.05.2018
comment
Большое спасибо - person ; 09.05.2018
comment
извините, еще один вопрос, я не очень понимаю, почему if(lastc=='\n') lastc, а не c? Я понимаю, что если я скажу if(c=='\n'), он напечатает вывод перед номером строки. Но как c=getchar узнает, что last c — мой последний символ? - person ; 09.05.2018
comment
Итак, мой главный вопрос, откуда getchar знает, что lastc — мой последний персонаж? - person ; 09.05.2018
comment
lastc — это отдельная переменная для хранения предыдущего символа, считанного из файла. Возможно, мне следовало назвать его prevc... Я инициализирую его значением '\n', чтобы убедиться, что строка с номером 01 печатается перед первой строкой вывода, и я сохраняю в ней значение c в конце цикла, так что это всегда значение предыдущего символа, когда я снова вызываю getchar. - person chqrlie; 09.05.2018

Вам нужно выполнить деление и мод на 10, чтобы получить цифру 10 и цифру единицы.

#include <stdio.h>
int main()
{
    int c;
    int counter=1;
    putchar('0');
    putchar('1');
    putchar(':');
    putchar(' ');
    while((c=getchar())!=EOF){
        putchar(c);
        if ( c == '\n' ) {
            ++counter;
            putchar(counter / 10 + '0');
            putchar(counter % 10 + '0');
            putchar(':');
            putchar(' ');

        }
    }
    return 0;
}
person Zach Jones    schedule 08.05.2018
comment
спасибо за ваш ответ, но если ввод, например, поле, то вывод выглядит так: 01: новая строка - person ; 08.05.2018
comment
как я могу изменить код, чтобы вывод выглядел так: 01: box - person ; 08.05.2018
comment
Я также хочу, чтобы нумерация строк шла от 01: до 50: нужен ли для этого цикл do while? - person ; 08.05.2018
comment
@momonosuke Смотрите мои правки. Вы можете сделать do-while, но тогда вам также придется выполнять c = getChar() вне цикла. - person Zach Jones; 08.05.2018
comment
Я попытался поместить c = getchar() вне основного цикла while и после цикла do while, однако я все равно получаю бесконечный цикл - person ; 08.05.2018