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

Ponowne wypełnienie tablicy tekstem

Object Storage Arubacloud
0 głosów
343 wizyt
pytanie zadane 6 września 2017 w C i C++ przez Provokator5 Początkujący (450 p.)

Hej, nie mogę sobie poradzić z ponownym wypełnieniem tablicy po jej zwiększeniu.

Chcę aby w drugim wypełnieniu tablicy wcześniejsze "teksty" zostały pominięte i dodane zostały tylko do nowych, pustych tablic (z założenia, że zmienimy wielkość tablicy na większą).


#include <iostream>
#include <string>

int zmiana_ile(int iile)
{
    std::cin >> iile;

    std::cin.clear();  // wyczyść bufor
    std::cin.sync();

    return iile;
}

int main()
{
    using std::cin;
    using std::cout;
    using std::string;
    using std::endl;

    int ile = 5;

    string *miejsce = new string[ile]; 
    
    for (int i = 0; i < ile; i++) // wypełnij liste tekstem
        miejsce[i] = "wolne miejsce";

        
    for (int i = 0; i < ile; i++)   // pokaż liste
        cout << i+1 << ": " << miejsce[i] << endl;

        
    cout << "zmien wartosc "ile": ";
    ile = zmiana_ile(ile);  // nadpisz wartość "ile"

    
    cout << "zmieniona wartosc "ile": " << ile << endl; // pokaz zmienna "ile" po zmianie

    
    // wypełnij listę, jeśli zmienna "ile" się zwiększyła z pominięciem już istniejących zmiennych
    for (int i = 0; i < ile; i++)
    {
        if( miejsce[i].empty() )
        miejsce[i] += "wolne miejsce";
    }

    for (int i = 0; i < ile; i++)   // pokaz zaktualizowana liste
        cout << i+1 << ": " << miejsce[i] << endl;



    delete [] miejsce; // usuń tablice


    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 6 września 2017 przez januszprogramowania Bywalec (2,840 p.)
wybrane 6 września 2017 przez Provokator5
 
Najlepsza

Rozumiem, że w funkcji 

int zmiana_ile(int iile)

chcesz zmienić rozmiar tablicy miejsce. Niestety w c++ nie da się zmienić rozmiaru tablic. Musisz zwolnić starą i utworzyć nową.

int zmiana_ile(int iile, std::string **m)
{
    std::cin >> iile;
    
    std::cin.clear();  // wyczyść bufor
    std::cin.sync();
    delete [] *m;
    *m = new std::string[iile];
    return iile;
}

Teraz musisz zmienić wywołanie tej funkcji na :

ile = zmiana_ile(ile, &miejsce);  // nadpisz wartość "ile"

Ponadto, tutaj:

cout << "zmien wartosc "ile": ";

by wyświetlić cudzysłów musisz poprzedzić go znakiem \ czyli :

cout << "zmien wartosc \"ile\": ";

 

komentarz 6 września 2017 przez Provokator5 Początkujący (450 p.)
Wielkie dzięki chłopaki za pomoc :) tego się nie spodziewałem, że nie da się tego tak zrobić.

januszprogramowania - Twoje rozwiązanie prawie spełniło by moje kryteria tylko, że zwalniając starą tablicę stracił bym te wcześniejsze "teksty", a chciałem aby zostały.

To chyba pozostaje mi teraz tylko zapisywać te "teksty" do pliku.

Chciałem poćwiczyć najpierw taki wariant manipulowania tablicami ale no cóż teraz wiem, że moim sposobem nie da rady :)
komentarz 6 września 2017 przez januszprogramowania Bywalec (2,840 p.)
Nie musisz do pliku. Wystarczy, że przed usunięciem starej tablicy skopiujesz jej zawartość do nowej.
komentarz 6 września 2017 przez Provokator5 Początkujący (450 p.)
No faktycznie... :p mały blond moment miałem ;p jeszcze raz, dzięki za pomoc :)
0 głosów
odpowiedź 6 września 2017 przez Ehlert Ekspert (212,670 p.)
Nie możesz tak robić. Na początku zaalokowałeś pamieć na 5 miejsc i tego się musisz trzymać.
0 głosów
odpowiedź 8 września 2017 przez Provokator5 Początkujący (450 p.)

Zastosowałem się do wskazówek i wypociłem poniższy kod.

Teoretycznie działa ale co x kompilacji program się crash'uje... czasem za 2 razem a czasami za 10.

Co zrobiłem źle ?

#include <iostream>
#include <string>
#include <cstring>

int zmiana_ile(int iile, std::string **m)
{
    std::cin >> iile;

    std::cin.clear();  // wyczyść bufor
    std::cin.sync();

    delete [] *m;
    *m = new std::string[iile];

    return iile;
}

int main()
{
    using std::cin;
    using std::cout;
    using std::string;
    using std::endl;

    int ile = 5, kopia_ile = ile;

    string *miejsce = new string[ile];

    string *kopia_miejsce = new string[ile];

    for (int i = 0; i < ile; i++) // wypełnij liste tekstem
        miejsce[i] = "wolne miejsce";

    for (int i = 0; i < ile; i++)
        kopia_miejsce[i] = miejsce[i];

    for (int i = 0; i < ile; i++)   // pokaż liste
        cout << i+1 << ": " << miejsce[i] << endl;


    cout << "zmien wartosc \"ile\": ";
    ile = zmiana_ile(ile, &miejsce);  // nadpisz wartość "ile"


    cout << "zmieniona wartosc \"ile\": " << ile << endl; // pokaz zmienna "ile" po zmianie

    for (int i = 0; i < ile; i++)
    {
        for (int i = 0; i < kopia_ile; i++)
        {
            strcpy ((char*)&miejsce[i], (char*)&kopia_miejsce[i]);

        }

        if (kopia_ile < ile)
        {
            for (int i = kopia_ile; i < ile; i++)
            {
                miejsce[i] = "Nowe miejsce";
            }
        } //if
    }//for

    kopia_ile = ile;

    for (int i = 0; i < ile; i++)   // pokaz zaktualizowana liste
        cout << i+1 << ": " << miejsce[i] << endl;



    delete [] miejsce; // usuń tablice
    delete [] kopia_miejsce;

    return 0;
}
komentarz 8 września 2017 przez januszprogramowania Bywalec (2,840 p.)
Zaiast
strcpy ((char*)&miejsce[i], (char*)&kopia_miejsce[i]);

wystarczy:

miejsce[i] =kopia_miejsce[i];

 

Podobne pytania

0 głosów
2 odpowiedzi 3,273 wizyt
0 głosów
2 odpowiedzi 235 wizyt
0 głosów
3 odpowiedzi 1,846 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez sakro95 Nowicjusz (170 p.)

92,540 zapytań

141,383 odpowiedzi

319,481 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...