Programa para imprimir las últimas 10 líneas

Dadas algunas líneas de texto en una string, cada línea está separada por el carácter ‘\n’. Imprime las últimas diez líneas. Si el número de líneas es inferior a 10, imprima todas las líneas. Fuente: Entrevista de Microsoft | Set 10 Los siguientes son los pasos 

1) Encuentre la última aparición de DELIM o ‘\n’ 

2) Inicialice la posición de destino como la última aparición de ‘\n’ y cuente como 0, y siga mientras cuenta <10

2.a) Encuentre la siguiente instancia de ‘\n’ y actualice la posición de destino

2.b) Omita ‘\n’ e incremente el conteo de ‘\n’ y actualice la posición de destino 3) Imprima la substring desde la posición de destino. 

C++

// C++ Program to print the last 10 lines.
// If number of lines is less than 10,
// then print all lines.
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
 
/* Function to print last n lines of a given string */
void print_last_lines(char *str, int n)
{
    /* Base case */
    if (n <= 0)
    return;
 
    size_t cnt = 0; // To store count of '\n' or DELIM
    char *target_pos = NULL; // To store the output position in str
 
    /* Step 1: Find the last occurrence of DELIM or '\n' */
    target_pos = strrchr(str, DELIM);
 
    /* Error if '\n' is not present at all */
    if (target_pos == NULL)
    {
        cout << "ERROR: string doesn't contain '\\n' character\n";
        return;
    }
 
    /* Step 2: Find the target position from
       where we need to print the string */
    while (cnt < n)
    {
        // Step 2.a: Find the next instance of '\n'
        while (str < target_pos && *target_pos != DELIM)
            --target_pos;
 
        /* Step 2.b: skip '\n' and increment count of '\n' */
        if (*target_pos == DELIM)
            --target_pos, ++cnt;
 
        /* str < target_pos means str has
        less than 10 '\n' characters, so break from loop */
        else
            break;
    }
 
    /* In while loop, target_pos is decremented 2 times,
    that's why target_pos + 2 */
    if (str < target_pos)
        target_pos += 2;
 
    // Step 3: Print the string from target_pos
    cout << target_pos << endl;
}
 
// Driver Code
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;
}
 
// This is code is contributed by rathbhupendra

C

/* Program to print the last 10 lines. If number of lines is less
   than 10, then print all lines. */
 
#include <stdio.h>
#include <string.h>
#define DELIM   '\n'
 
/* Function to print last n lines of a given string */
void print_last_lines(char *str, int n)
{
    /* Base case */
    if (n <= 0)
       return;
 
    size_t cnt  = 0; // To store count of '\n' or DELIM
    char *target_pos   = NULL; // To store the output position in str
 
    /* Step 1: Find the last occurrence of DELIM or '\n' */
    target_pos = strrchr(str, DELIM);
 
    /* Error if '\n' is not present at all */
    if (target_pos == NULL)
    {
        fprintf(stderr, "ERROR: string doesn't contain '\\n' character\n");
        return;
    }
 
    /* Step 2: Find the target position from where we need to print the string */
    while (cnt < n)
    {
        // Step 2.a: Find the next instance of '\n'
        while (str < target_pos && *target_pos != DELIM)
            --target_pos;
 
         /* Step 2.b: skip '\n' and increment count of '\n' */
        if (*target_pos ==  DELIM)
            --target_pos, ++cnt;
 
        /* str < target_pos means str has less than 10 '\n' characters,
           so break from loop */
        else
            break;
    }
 
    /* In while loop, target_pos is decremented 2 times, that's why target_pos + 2 */
    if (str < target_pos)
        target_pos += 2;
 
    // Step 3: Print the string from target_pos
    printf("%s\n", target_pos);
}
 
// Driver program to test above function
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;
}

Producción:

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

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

Complejidad de tiempo: O(n)

Espacio Auxiliar: O(1)

Nota: El programa anterior se puede modificar para imprimir las últimas N líneas pasando N en lugar de 10. N puede almacenar cualquier valor entero. Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *