• 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

0 głosów
3,487 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 (150,940 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,620 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 (150,940 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ź 228 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,413 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez TeslaX93 Gaduła (3,590 p.)
0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 15 listopada 2020 w Assembler przez Wookiee Użytkownik (980 p.)

89,693 zapytań

138,297 odpowiedzi

309,243 komentarzy

59,623 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

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

...