Nie wyświetla całego napisu ze zmiennej typu string

0

OTO MÓJ KOD :

#include <iostream>
using namespace std;

int main(int argc, char** argv) 
{
	string s;
	string w;
	int dlugosc;
	int i;
	
	cout << "Podaj slowo :" << endl;
	cin >> s;
	
	dlugosc = s.size();
	
	if(dlugosc%2!=0)
		{
			dlugosc=dlugosc-1;
			w[dlugosc]=s[dlugosc];
		}
		
	for(i=0; i<dlugosc; i+=2)
		{
			w[i]=s[i+1];
			w[i+1]=s[i];
		}	
	
	cout << "dlugosc w: "<< w.size();
	cout << w[0] << w[1] << w[2] << w[3] << w[4] << endl;
	cout << w;
	
	return 0;
}

Nie mogę wyświetlić całego napisu który znajduje się w zmiennej typu string - w.
Po sprawdzeniu długości w, również zwraca mi 0.
Jednak po wyświetleniu każdej komórki po kolei jest wynik prawidłowy.
Co tu jest nie tak?

1

A gdzie zainicjalizowałeś poprawnie string w? Zadeklarowałeś tylko zmienną i zaraz zacząłeś się bawić wnętrznościami tego stringa. Niby w którym miejscu rozmiar mu się zmienił?

0

String s zadeklarowałem tak samo, a mimo to działa.
Czyli co w tym wypadku zrobić?
Zmienić deklaracje na dynamiczną ?

string *w=new string;

coś takiego?

0

Nie inicjujesz zawartości tego stringa.
Innymi słowy majstrujesz po byle czym, bo stworzyłeś jedynie instancję klasy.

0

Czy lepszym rozwiązaniem byłoby tutaj zastosowanie tablicy?
Jest to zadanie maturalne z pierwszej części egzaminu. Mogę to również pisać w pseudokodzie, ale jakoś wydawało mi się bardziej zrozumiałe w C++.

1

@Bartolinho10 ale co bardziej zrozumiałe? Przecież to co napisałeś nie ma sensu. Masz pustego stringa o długości 0 a potem indeksujesz go sobie jakby miał dlugość N. I co? Myślisz że on sie tak sam rozciągnie? A może doczytasz w dokumentacji jednak?

If pos is not greater than the string length, the function never throws exceptions (no-throw guarantee).
Otherwise, it causes undefined behavior.

za http://www.cplusplus.com/reference/string/string/operator[]/

1

Nie jest ważne w sumie w czym to przechowasz, ale ważne żeby miejsce gdzie zapisujesz dane było zainicjalizowane.
bo w linijce

w[dlugosc]=s[dlugosc];

do komórki stringa o numerze [dlugosc] przypisujesz jakąś wartość, ale taka komórka w ogóle nie istnieje, dopisz sobie po tym

cout << w.size()

to sam sie przekonasz.

1

W tym wypadku traktowanie stringa jako tablicy char mija się trochę celem, lepszym rozwiązaniem jest zrobić to w ten sposób:

w+=s[i+1];
w+=s[i];
1
Bartolinho10 napisał(a):

String s zadeklarowałem tak samo, a mimo to działa.

Bo potem miałeś

cin >> s

Jeśli chcesz bawić się w ten sposób, to możesz zrobić:

cin >> s;
w.resize(s.size());
0

Dziękuję wszystkim za pomoc :)
A powiedzcie mi, mam taki kodzik, wydaje mi się być wszystko w porządku, a mimo to Dev wyrzuca mi informacje ciągle "Kod źródłowy nie jest skompilowany" . To wina środowiska? Jak się uporać z takim błędem?

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

bool palindrom(string napis)
{
	int i=0;
	int j=0;
	
	for(i=0,j=napis.size()-1; i<j; i++,j--)
		{
			if(napis[i]!=napis[j])
				return false;
		}
	
	 return true;
}


int main(int argc, char** argv) 
{
	ifstream plik("dane.txt");
	ofstream odp("zadanie4.txt");
	string napis;
	int i=0;
	
	for(i=0; i<1000; i++)
		{
			plik >> napis;
			
			if(palindrom(napis)) 
				odp << napis << endl;
			
		}
	
	
	return 0;
}
 
0

To go skompiluj...

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