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

2015-01-23 15:10
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?

edytowany 2x, ostatnio: furious programming, 2015-01-23 17:10

Pozostało 580 znaków

2015-01-23 15:16
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ł?

Pozostało 580 znaków

2015-01-23 16:40
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?

Pozostało 580 znaków

2015-01-23 16:44
0

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


Pozostało 580 znaków

2015-01-23 16:57
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++.

Pozostało 580 znaków

2015-01-23 17:08
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[]/


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-23 17:09

Pozostało 580 znaków

2015-01-23 17:13
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.

Pozostało 580 znaków

2015-01-23 17:27
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];
edytowany 1x, ostatnio: Kamil9132, 2015-01-23 17:27
Przy tym sposobie nie działa mi program, kiedy jest nieparzysta liczba znaków zmiennej s. Nie wiem dlaczego :) - Bartolinho10 2015-01-23 20:30
Obstawiam linię w[dlugosc]=s[dlugosc];lub cout &lt;&lt; w[0] &lt;&lt; w[1] &lt;&lt; w[2] &lt;&lt; w[3] &lt;&lt; w[4] &lt;&lt; endl; - Kamil9132 2015-01-23 21:01

Pozostało 580 znaków

2015-01-23 17:34
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());

Pozostało 580 znaków

2015-01-23 20:32
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;
}

Pozostało 580 znaków

2015-01-24 01:37
0

To go skompiluj...


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
Kompiluję ale nie da się. Niby kompiluje, pisze że z powodzeniem a mimo to ciągle komunikat : "Kod źródłowy nie jest skompilowany" - Bartolinho10 2015-01-24 11:09
Pozostaje tylko użyć jakiegoś lepszego IDE. - somekind 2015-01-24 12:19
Problem rozwiązany, wina Dev'a . W C::B nie ma tego problemu, wszystko działa :) - Bartolinho10 2015-01-24 12:34

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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