Рубрики

Программа для печати последних 10 строк

Учитывая несколько строк текста в одной строке, каждая строка отделяется символом '/ n'. Напечатайте последние десять строк. Если количество строк меньше 10, выведите все строки.

Источник: Microsoft Интервью | Набор 10

Ниже приведены шаги
1) Найти последнее вхождение DELIM или '/ n'
2) Инициализируйте целевую позицию как последнее вхождение '/ n' и считайте как 0, и делайте следующее, пока счет <10
…… 2.a) Найдите следующий экземпляр '/ n' и обновите целевую позицию
… .. 2.b) Пропустить '/ n' и увеличить счетчик '/ n' и обновить целевую позицию
3) Распечатать подстроку из целевой позиции.

C ++

// C ++ Программа для печати последних 10 строк.
// Если количество строк меньше 10,
// затем печатаем все строки.
#include <bits/stdc++.h>

using namespace std; 

#define DELIM '\n' 

  
/ * Функция для печати последних n строк данной строки * /

void print_last_lines(char *str, int n) 

    /* Базовый вариант */

    if (n <= 0) 

    return

  

    size_t cnt = 0; // Для сохранения количества '/ n' или DELIM

    char *target_pos = NULL; // Для сохранения выходной позиции в str

  

    / * Шаг 1: Найти последнее вхождение DELIM или '/ n' * /

    target_pos = strrchr(str, DELIM); 

  

    / * Ошибка, если '/ n' вообще отсутствует * /

    if (target_pos == NULL) 

    

        cout << "ERROR: string doesn't contain '\\n' character\n"

        return

    

  

    / * Шаг 2: Найти целевую позицию из

       где нам нужно напечатать строку * /

    while (cnt < n) 

    

        // Шаг 2.a: Найти следующий экземпляр '/ n'

        while (str < target_pos && *target_pos != DELIM) 

            --target_pos; 

  

        / * Шаг 2.b: пропустить '/ n' и увеличить счетчик '/ n' * /

        if (*target_pos == DELIM) 

            --target_pos, ++cnt; 

  

        / * str <target_pos означает, что str имеет

        менее 10 символов '/ n', поэтому вырывается из цикла * /

        else

            break

    

  

    / * В цикле while значение target_pos уменьшается в 2 раза,

    вот почему target_pos + 2 * /

    if (str < target_pos) 

        target_pos += 2; 

  

    // Шаг 3: Распечатать строку из target_pos

    cout << target_pos << endl; 

  
// Код драйвера

int main(void

    char *str1 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9"

                "\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17"

                "\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25"

    char *str2 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7"

    char *str3 ="\n"

    char *str4 = ""

  

    print_last_lines(str1, 10); 

    cout << "-----------------\n"

  

    print_last_lines(str2, 10); 

    cout << "-----------------\n";

  

    print_last_lines(str3, 10); 

    cout << "-----------------\n";; 

  

    print_last_lines(str4, 10); 

    cout << "-----------------\n";

  

    return 0; 

  
// Это код, предоставленный rathbhupendra

С

/ * Программа для печати последних 10 строк. Если количество строк меньше

   чем 10, затем выведите все строки. * /

  
#include <stdio.h>
#include <string.h>
#define DELIM   '\n'

  
/ * Функция для печати последних n строк данной строки * /

void print_last_lines(char *str, int n)

{

    /* Базовый вариант */

    if (n <= 0)

       return;

  

    size_t cnt  = 0; // Для сохранения количества '/ n' или DELIM

    char *target_pos   = NULL; // Для сохранения выходной позиции в str

  

    / * Шаг 1: Найти последнее вхождение DELIM или '/ n' * /

    target_pos = strrchr(str, DELIM);

  

    / * Ошибка, если '/ n' вообще отсутствует * /

    if (target_pos == NULL)

    {

        fprintf(stderr, "ERROR: string doesn't contain '\\n' character\n");

        return;

    }

  

    / * Шаг 2: Найти целевую позицию, откуда мы должны напечатать строку * /

    while (cnt < n)

    {

        // Шаг 2.a: Найти следующий экземпляр '/ n'

        while (str < target_pos && *target_pos != DELIM)

            --target_pos;

  

         / * Шаг 2.b: пропустить '/ n' и увеличить счетчик '/ n' * /

        if (*target_pos ==  DELIM)

            --target_pos, ++cnt;

  

        / * str <target_pos означает, что str содержит менее 10 символов '/ n',

           так вырваться из цикла * /

        else

            break;

    }

  

    / * В цикле while значение target_pos уменьшается в 2 раза, поэтому target_pos + 2 * /

    if (str < target_pos)

        target_pos += 2;

  

    // Шаг 3: Распечатать строку из target_pos

    printf("%s\n", target_pos);

}

  
// Программа драйвера для проверки вышеуказанной функции

int main(void)

{

    char *str1 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9"

                 "\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17"

                 "\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";

    char *str2 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7";

    char *str3 = "\n";

    char *str4 = "";

  

    print_last_lines(str1, 10);

    printf("-----------------\n");

  

    print_last_lines(str2, 10);

    printf("-----------------\n");

  

    print_last_lines(str3, 10);

    printf("-----------------\n");

  

    print_last_lines(str4, 10);

    printf("-----------------\n");

  

    return 0;

}

Выход:

str16
str17
str18
str19
str20
str21
str22
str23
str24
str25
-----------------
str1
str2
str3
str4
str5
str6
str7
-----------------

-----------------
ERROR: string doesn't contain '\n' character
-----------------

Примечание: указанную выше программу можно изменить для печати последних N строк, передав N вместо 10. N может хранить любое целочисленное значение.
Эта статья составлена Нарендрой Кангралкар . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Программа для печати последних 10 строк

0.00 (0%) 0 votes