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