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

Kopiowanie tekstu z użyciem wskaźników

Cloud VPS
+1 głos
677 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez Agnes Użytkownik (990 p.)
edycja 29 kwietnia 2018 przez Agnes

Napisz program, używając wskaźników odwracający podany tekst. 

const int n = 6;
char z1[n] = { 't', 'e', 'k', 's', 't', '\0' };
char z2[n];

void kopia1(char a[n], char b[n])
{
	for (int i = 0; i < n; i++)
	{
		char *ptr = a[i];
		b[i] = *ptr;
	}
	for (int i = n; i < n; i++) cout << b[i];

	
	
}
int main()
{
	kopia1(z1, z2);

	getchar();
}

Dlaczego w linii ósmej jest błąd?

EDIT: Przepraszam, tak się kończy dodawanie posta o północy -.- Chodziło mi o polecenie, gdzie trzeba było skopiować zawartość tablicy do drugiej tablicy docelowej

2 odpowiedzi

+1 głos
odpowiedź 26 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)

Wyrażenie `a[i]` jest typu `char`, nie `char *`. Z kolei druga pętla jest niepoprawnie napisana. Jeśli ma wypisywać znaki w odwrotnej kolejności, to musi ona wyglądać tak:

for (int i = n - 2; i >= 0; i--) cout << b[i]; // n - 2, ponieważ nie chcemy wypisać zera
0 głosów
odpowiedź 26 kwietnia 2018 przez mokrowski Mędrzec (159,000 p.)
edycja 26 kwietnia 2018 przez mokrowski

Jeśli polecenie brzmi jak to napisałaś, to brniesz w ślepy zaułek. Odnosząc się do Twojego kodu intencję kopi możesz zrealizować tak:

for (size_t i = 0; i < n; ++i)
{
        b[i] = a[i];
}

Ale nie jest spełnione wymaganie polecenia że są to wskaźniki.

Obrócenie napisu można z łatwością wykonać "w miejscu" bez alokowania dodatkowej pamięci. Wystarczy:

1. Do funkcji podać wskaźnik na pierwszy element napisu.

2. Funkcja z użyciem strlen(...) (lub std::strlen(..) ) z <string.h> (lub <cstring>), obliczy długość łańcucha. Przed wskaźnikiem końca jest ostatni znak. Hmm.. to ma być w C czy C++?

3. Wymieniasz znaki z początku i końca oraz inkrementujesz wskaźnik początku i dekrementujesz wskaźnik końca. Robisz to do momentu zrównania się wskaźników.

PS. Kopiowanie w końcu czy odwracanie i C czy C++?

komentarz 29 maja 2018 przez Agnes Użytkownik (990 p.)
Kopiowanie, C++

I wszystko by było ok, gdyby nie to, że wartość zwracana strlen() nie może być przypisana do stałej. A stała jest tu potrzebna, by zainicjalizować tablicę.
komentarz 29 maja 2018 przez mokrowski Mędrzec (159,000 p.)

Nie nie jest potrzebna stała. Takie tablice (z wielkością opisaną przez parametr nie będący stałą) w C++ alokuje się dynamicznie. Alokowanie tablic statycznie jest właściwością C, nazywa się VLA (ang. Variable Length Array) i jest często dostarczane jako rozszerzenie dla kompilatora C++ ale jest poza standardem C++.

Podobne pytania

0 głosów
1 odpowiedź 1,064 wizyt
0 głosów
1 odpowiedź 380 wizyt
0 głosów
1 odpowiedź 732 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez kidcudi6 Nowicjusz (170 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,910 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

Kursy INF.02 i INF.03
...