Operacje na tablicach char

0

No więc mam takie zadanie:
Napisać funkcję, która zarezerwuje 10 - elementową tablicę (tablica) wskaźników do C-Stringów.
Następnie przy użyciu pętli for dla każdego elementu tablicy przypisać adres 80 znakowej tablicy C-String za pomocą operatora new, w każdej z tablic umieścić C-String "To jest tablica nr: n" (gdzie n tam nr tablicy od 0), nast. za pomocą kolejnej pętli for wypisać wszystko na ekranie, później zamienić adresy wskaźników tablicy 3 i 6 i znowu wypisać.

//      c-strings_wsk_new.cpp
// CPR wycięte, licencja GPL :D

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

//******************************DEKLARACJE******************************

char *tablica ();
void connect(char *src, char *dest);
void chng_adr(void * adr1, void * adr2);

//******************************GŁÓWNY**********************************
int main(int argc, char** argv)
{
    char *linijka;
    linijka = tablica();
    for (int i = 0; i < 10; i++)
    {
        *(linijka+i) = new char[80];
        strcpy(linijka+i, "To jest linijka nr: ");
        char nr;
        sprintf(&nr, "%d", i);
        connect(linijka+i, &nr);
    }
    for (int i = 0; i < 10; i++)
    cout << linijka[i] << endl;
    chng_adr(linijka+3, linijka+6);
    for (int i = 0; i < 10; i++)
    cout << linijka[i] << endl;
    return 0;
}

//******************************FUNKCJE*********************************
char *tablica()
{
    char *tab = new char[10];
    return(tab);
}

void connect(char *dest, char *src)
{
    while (*(dest++));
    dest--;
    while ((*(dest++)=*(src++)));
}

void chng_adr(void * adr1, void * adr2)
{
    void *old = adr1;
    adr1 = adr2;
    adr2 = old;
}

ale nie działa.
Działało jak main wyglądało tak:

int main(int argc, char** argv)
{
    char *linijka;
    linijka = tablica();
    for (int i = 0; i < 10; i++)
    {
        linijka = new char[80];
        strcpy(linijka, "To jest linijka nr: ");
        char nr;
        sprintf(&nr, "%d", i);
        connect(linijka, &nr);
        cout << linijka++ << endl;
    }

    return 0;
}

Ale wtedy z resztą był problem...

Ktoś pomoże? Zadanie z Symfonii C++ Standard...

0

Przeczytaj jeszcze raz rozdzial o wskaznikach:
char *tab[10]
tab jest 10-elementowa tablica wskaznikow na char
potem dajesz petle
for(int i = 0; i < 10; i++)
tab[i] = new char[80];

zwalnianie pamieci
for(int i = 0; i < 10; i++)
delete tab[i];

Z reszta sobie poradzisz.

0

Dzięki :)
Powtórzyłem sobie dział wskaźników jednak pierw przeczytałem ponownie info dot. czytania i zapisywania nazw (chyba sobie to wydrukuję ;) )
Oto co wyplułem:

//      c-strings_wsk_new.cpp
//      
//      Copyright 2009 Tomasz Tracz <[email protected]>
//      
//      This program is free software; you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation; either version 2 of the License, or
//      (at your option) any later version.
//      
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
//      
//      You should have received a copy of the GNU General Public License
//      along with this program; if not, write to the Free Software
//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
//      MA 02110-1301, USA.

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

//******************************DEKLARACJE******************************

void connect(char *src, char *dest);
char **tab();

//******************************GŁÓWNY**********************************
int main(int argc, char** argv)
{
    char **linijka = tab();
    for (int i = 0; i < 10; i++)
        linijka[i] = new char[80];
    for (int i = 0; i < 10; i++)
    {                               // dopisuje "To jest linijka nr: n" do każdego elementu tablicy linijka
        strcpy(linijka[i], "To jest linijka nr: "); // A
        char nr;
        sprintf(&nr, "%d", i);
        connect(linijka[i], &nr); // B
    }
    for (int i = 0; i < 10; i++)    // wypisujemy każdą linijkę po kolei
        cout << linijka[i] << endl; // C
    cout << endl;
    char *old = linijka[3];         // zapisujemy adres linijka[3] do elementu wskazującego na obiekt char
    linijka[3] = linijka[6];        // do linijka[3] przypisujemy linijka[6] 
    linijka[6] = old;               // do linijka[6] przypisujemy starą wartość linijka[3]
    for (int i = 0; i < 10; i++)    // wyświetlamy wszystko
        cout << linijka[i] << endl;
    for(int i = 0; i < 10; i++) // usuwamy zarezerwowane obiekty
        delete linijka[i];
    delete[] linijka;               // usuwamy tablicę linijka[] stworzoną w funkcji char **tab()
    return 0;
}

//******************************FUNKCJE*********************************

void connect(char *dest, char *src)
{
    while (*(dest++));
    dest--;
    while (( *(dest++) = *(src++) ));
}

char **tab()
{
    return(new char *[10]);
}

Paru rzeczy jednak wciąż nie rozumiem, mianowicie strcpy wysłałem adres linijka[i] (A), i w tablicę char pod tym adresem ta funkcja dodała mi C-String, tak samo w connect wysłałem adres (B), jednak już w cout (C) wypisuje mi nie adres, który powinien być pod linijka[i] tylko C-String, który pod tym adresem jest zapisany. To moje początki z C++, dlatego proszę o cierpliwość... :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0