• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ocena kodu C++ Stos

VPS Starter Arubacloud
0 głosów
345 wizyt
pytanie zadane 24 maja 2019 w C i C++ przez Kaper99 Użytkownik (660 p.)
przywrócone 24 maja 2019 przez Kaper99

Witam,

Czy mógłby ktoś bardziej doświadczony ocenić ten kod pod kątem poprawności , estetyki czy też nie ma żadnych wycieków pamięci ? Po kompilacji konsola nie wspomina o żadnych błędach ani wyciekach pamięci.  
Program ma za zadanie wczytać z pliku zdania które są zapisane od tyłu ( zamiast "Ala ma kota." to "kota ma Ala."
i wypisać w odpowiedniej kolejności.

#include <iostream>
#include <fstream>
using namespace std;
struct stos
{
    string slowo;
    stos* next;
};
void add_stos(string slowo, stos*& top);
void show_stos(stos*& top, char znak_konca);
void remove_from_stos(stos*& top);
void wczytywanko(string sciezka, stos*& top);

int main()
{
    stos* top = nullptr;
    string sciezka = "dane.txt";
    wczytywanko(sciezka, top);

    return 0;
}
void wczytywanko(string sciezka, stos*& top)
{
    ifstream plik;
    string tekst_temp;

    int d;
    char znak_konca;
    plik.open(sciezka);
    while (!plik.eof())
    {
        getline(plik, tekst_temp, ' ');
        d = tekst_temp.length();
        if (tekst_temp[d - 1] == '.' || tekst_temp[d - 1] == '!' || tekst_temp[d - 1] == '?')
        {
            znak_konca = tekst_temp[d - 1];
            tekst_temp[d - 1] = ' ';
            add_stos(tekst_temp, top);
            show_stos(top, znak_konca);
        }
        else
        {
            add_stos(tekst_temp, top);
        }
    }
    znak_konca = ' \b';
    show_stos(top, znak_konca);

    plik.close();
}

void add_stos(string slowo, stos*& top)
{
    stos* temp = new stos;
    temp->slowo = slowo;
    temp->next = top;
    top = temp;
}
void show_stos(stos*& top, char znak_konca)
{
    int i = 0;
    while (top != nullptr)
    {

        if (i == 0)
        {
            cout << top->slowo;
            top = top->next;
            i++;
        }
        else
        {
            cout << top->slowo << " ";
            top = top->next;
            i++;
        }
    }
    cout << "\b" << znak_konca << endl;
}
void remove_from_stos(stos*& top)
{
    if (top == nullptr)
    {
        cout << "Pusty stos" << endl;
    }
    else
    {
        stos* temp = top;
        top = top->next;
        delete temp;
    }
}

 

2 odpowiedzi

+1 głos
odpowiedź 24 maja 2019 przez adrian17 Ekspert (344,100 p.)

Po kompilacji konsola nie wspomina o żadnych błędach ani wyciekach pamięci. 

Normalnie program nie wykrywa własnych wycieków i ich nie raportuje, więc tutaj nic dziwnego. Natomiast program zdecydowanie ma wycieki, nigdzie nie zwalniasz tej pamięci.

Poza tym, na pewno kompilator nie krzyczy ostrzeżeniem na to?

znak_konca = ' \b';

 

komentarz 24 maja 2019 przez Kaper99 Użytkownik (660 p.)

Faktycznie,krzyczy ostrzeżeniem zmieniłem na  

znak_konca = '\b'

Czy teraz już dobrze (kompilator nie wyrzuca ostrzeżeń). Ewentualnie jak można inaczej uzyskać usunięcie jednej spacji ?

+1 głos
odpowiedź 25 maja 2019 przez j23 Mędrzec (194,920 p.)
    while (!plik.eof())
    {
        getline(plik, tekst_temp, ' ');

Jeśli już, to:

while (getline(plik, tekst_temp, ' ')) {
...

tylko dlaczego nie użyjesz operatora >>, skoro czytasz słowa?

 

Zamiast tekst_temp[d - 1] użyj tekst_temp.back().

 

Jak już przekazujesz std::stringa przez wartość, niech będzie chociaż z tego jakiś pożytek:

add_stos(std::move(tekst_temp), top);
...

void add_stos(string slowo, stos*& top)
{
    stos* temp = new stos;
    temp->slowo = std::move(slowo);
    temp->next = top;
    top = temp;
}

 

komentarz 27 maja 2019 przez Kaper99 Użytkownik (660 p.)
Ok, dziękuję za odpowiedź

Podobne pytania

0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 17 czerwca 2019 w C i C++ przez Giero112 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 1,320 wizyt
pytanie zadane 23 maja 2019 w C i C++ przez Kaper99 Użytkownik (660 p.)
0 głosów
2 odpowiedzi 1,188 wizyt
pytanie zadane 9 września 2018 w C i C++ przez misiek90 Użytkownik (730 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...