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

Odwracanie stringa i zapisywanie do nowego

Object Storage Arubacloud
0 głosów
4,140 wizyt
pytanie zadane 5 kwietnia 2017 w C i C++ przez E1 Obywatel (1,810 p.)

Cześć. Jak widać w załączonym kodzie próbuję odwrócić stringa przy pomocy pętli for. Niestety rezultat nie wyświetla się. Wstawienie wypisywania litera po literze w pętli daje radę, ale nie o to mi chodzi. Chcę wyświetlić stringa odwr jako całość (muszę go użyć na dalszych etapach programu). Co robię nie tak?

 

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
	
	string	napis = "abcde";
	int dl = napis.length();

	string odwr;
	for (int i = dl - 1; i >= 0; i--)
	{
		int j = 0;
		odwr[j] = napis[i];
		
		while (j<dl) { j++; }
	
	}
	cout << odwr<<endl;
	return 0;

}

 

5 odpowiedzi

+2 głosów
odpowiedź 5 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
Hmm.. no tak.. nagłówek <algorithm> wczytujesz a nie zastosowałeś algorytmu std::reverse(...) :-) Albo przy kopii std::reverse_copy(...)
+1 głos
odpowiedź 5 kwietnia 2017 przez PsyLisek Użytkownik (570 p.)
Przy każdym cyklu pętli ustawiasz j=0, dlatego nic nie wychodzi. Cały czas starasz się zapisać te słowo dla odwr[0].
+1 głos
odpowiedź 5 kwietnia 2017 przez bartolinciu Dyskutant (7,580 p.)
zapisywanie do odwr nie działa bo jest on utworzony jako pusty napis więc nie ma możliwości edytowania jego zawartości. aby twój kod zadziałał musisz dodać jeszcze przed pętlą "odwr.resize(dl);", a poza tym pozbądź się zmiennej "j", przy kopiowaniu znaku zamień "j" na "i", a "i" na "dl - i - 1" , a parametry for'a na "int i =0; i<dl; i++"
+1 głos
odpowiedź 5 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
No dobrze.. załóżmy że chcesz to "zrobić na piechotę" dla celów edukacyjnych :-)

Pomysł polega na tym że zamieniasz między sobą elementy z początku i końca stringu do momentu aż ten z początku ma niższy index niż ten z końca. Nie ma przypadku szczególnego dla stringu z nieparzystą ilością znaków bo to łamie warunek że index początku ma być mniejszy od indeksu końca (tu będą sobie równe).

W ten sposób ilość przestawień będzie n/2 czyli połowa długości. Teraz jak przestawić elementy...

Elementy najlepiej przestawić z użyciem swap(..) bo swap ma specjalizacje dla wielu typów w bibliotece standardowej i jest wysoce optymalizowane. No ale ... pewnie chcesz "na piechotę".... W takim razie...

Zamianę należy przeprowadzić z użyciem zmiennej tymczasowej. Wprawdzie znany jest trik z XOR (poszukaj w google hasła: xor swap c), ale na współczesnych architekturach jest on zupełnie nieopłacalny.

To tyle. Tak więc.. raczej while a nie for. Jak się upierasz przy for, to będą 2 indeksy, pierwszy inkrementowany, drugi dekrementowany i warunek stopu to pierwszy < drugi.

Z premedytacją napisałem prozą aby nie psuć zabawy własnej implementacji... To co wyżej można ulepszać ale.. to jest jak dodawanie petard do roweru by pojechał szybciej :-)
0 głosów
odpowiedź 6 kwietnia 2017 przez E1 Obywatel (1,810 p.)
Dzięki za odpowiedzi. Osobiście skorzystałem z biblioteki algorithm (będzie trzeba się zacząć przez nie wszystkie przekopywać, bo jak widać znacznie przyspieszają proces kreacji). NIemniej pozostałe wypowiedzi pozwoliły na lepsze zrozumienie czasem głupich pomyłek jakie zdarzyło mi się popełnić w programie.

Podobne pytania

0 głosów
1 odpowiedź 878 wizyt
pytanie zadane 23 września 2021 w C i C++ przez Joshe Początkujący (280 p.)
0 głosów
1 odpowiedź 1,735 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez TeslaX93 Gaduła (3,600 p.)
0 głosów
1 odpowiedź 236 wizyt
pytanie zadane 15 listopada 2020 w Assembler przez Wookiee Użytkownik (980 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 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!

...