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

Ponowne wypełnienie tablicy tekstem

0 głosów
83 wizyt
pytanie zadane 6 września w C i C++ przez Provokator5 Początkujący (320 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 przez januszprogramowania Bywalec (2,900 p.)
wybrane 6 września 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 przez Provokator5 Początkujący (320 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 przez januszprogramowania Bywalec (2,900 p.)
Nie musisz do pliku. Wystarczy, że przed usunięciem starej tablicy skopiujesz jej zawartość do nowej.
komentarz 6 września przez Provokator5 Początkujący (320 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 przez Ehlert VIP (113,970 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 przez Provokator5 Początkujący (320 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 przez januszprogramowania Bywalec (2,900 p.)
Zaiast
strcpy ((char*)&miejsce[i], (char*)&kopia_miejsce[i]);

wystarczy:

miejsce[i] =kopia_miejsce[i];

 

Podobne pytania

0 głosów
2 odpowiedzi 132 wizyt
0 głosów
3 odpowiedzi 171 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez sakro95 Nowicjusz (170 p.)
–1 głos
2 odpowiedzi 65 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez KTK Nowicjusz (150 p.)

42,435 zapytań

81,741 odpowiedzi

162,233 komentarzy

20,381 pasjonatów

Przeglądających: 309
Pasjonatów: 35 Gości: 274

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...