Jak użyć getline() do zmiennej z klasy?

2013-11-26 14:48

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

Witam.

Chcę w swoim programie pobrać od użytkownika jakiś tekst łacznię ze spacjami.
W tym celu używam getline(), jednak problem w tym że zmienna która przechowuje ten tekst jest w klasie i nie zbyt mi to działa:

            obiekt.tekst;
            std::cout <<"\n\nPodaj tekst do zaszyfrowania: ";
            getline (cin, tekst); // pobiera tekst od uzytkownika
            std::cout <<"\n\n";
            obiekt.znaki = obiekt.tekst.length(); // przypisanie zmiennej znaki wartosci odpowiadajacej ilosci znakow w tekscie
            std::cout <<"\nWylosowano nastepujace liczby:  ";
            for ( int i = 0; i < obiekt.znaki; i++ ) 
               {
                  obiekt.wylosowane =( rand() % 31 ) + 0;
                  a++;
                  b[a] = obiekt.wylosowane;
                  std::cout << b[a] <<" ";
               }

Po uruchomieniu kompilacji program dochodzi do"podaj tekst do zaszyfrowania" i następuję koniec. Co zrobiłem źle że mi ta funckcja getline() nie działa?

edytowany 2x, ostatnio: aurel, 2013-11-26 16:26

Pozostało 580 znaków

2013-11-26 15:00

Rejestracja: 10 lat temu

Ostatnio: 1 tydzień temu

0
#include <iostream>
#include <string>
using namespace std;
struct p
{
    string bardzo_dlugi_tekst;
};

int main()
{
    p obiekt;

    cout << "Podaj tekst: ";
    getline(cin, obiekt.bardzo_dlugi_tekst);
    cout << "Bardzo dlugi tekst: " << obiekt.bardzo_dlugi_tekst << "\n";

    return 0;
}

Błąd u Ciebie jest tutaj : getline (cin, tekst); // pobiera tekst od uzytkownika
a co to ma być ? : obiekt.tekst; do czego to jest ??
poprawna : getline(cin, obiekt.tekst);

dodanie znaczników `` - fp


...
edytowany 1x, ostatnio: furious programming, 2013-11-26 23:51
Przypominam o wstawianiu kodu w znaczniki kolorujące składnię; - furious programming 2013-11-26 23:51

Pozostało 580 znaków

2013-11-26 15:13

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

kurde sory mój kod wygląda właśnie tak jak napisałeś. Tylko modyfikowałem go i musiałem przypadkowo zapisać nim wkleiłem go tutaj.

Ta linijka dokładnie tak u mnie wygląda: getline (cin, obiekt.tekst);

No i nie pobiera nic od użytkownika. Co najlepsze gdy zrobię tak: cin >>. obiekt.tekst; to wszystko działa.

dodanie znaczników `` - fp

edytowany 1x, ostatnio: furious programming, 2013-11-26 23:52
To co podał @Resident działa beż zarzutów: http://ideone.com/YEZY8q jak u ciebie jest tak samo to szukaj różnicy. - _13th_Dragon 2013-11-26 17:28
@dejmien - wstawiaj kod w znaczniki kolorujące składnię, albo chodziaż w &lt;code&gt; - furious programming 2013-11-26 23:52

Pozostało 580 znaków

ququ
2013-11-26 16:47
ququ
0

wklej cały kod, jeśli jest długi to na pastebin

Pozostało 580 znaków

2013-11-26 18:03

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

O to kod:


#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>

class enigma // tworzy obiekt ,,enigma''
{
    public:
    char tablica[31]; // tablica przechowywujaca znaki do losowania
    int znaki; // zmienna przechowywujaca ilosc znakow w tekscie
    int wylosowane; // zmienna przechowywujaca wylosowane liczby
    std::string tekst;//zmienna przochywujaca tekst

    void menu() // Menu programu
    {
    std::cout <<"\t\t\t==========" << std::endl;
    std::cout <<"\t\t\t||ENIGMA||" << std::endl;
    std::cout <<"\t\t\t==========" << std::endl;

    std::cout <<"\n\n";
    std::cout <<"==================" << std::endl;
    std::cout <<"||1. Szyfrowanie||" << std::endl;
    std::cout <<"||0. Wyjscie    ||" << std::endl;
    std::cout <<"==================" << std::endl;

    }

};

int main()
{
    using namespace std;
    //==============================================
    //zmienne skalarne spoza obiektu enigma
    int opcja; // zmienna odpowiedzialne za switch
    int a = 0;// zmienna pomocnicza
    static int b [30]; // zmienna pomocnicza
    int c = 0;// zmienna pomocnicza
    int losowa_tablica[14] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13};
    static int gotowe_liczby[20]; 
    int d = 0;
    int e;
    int j = 31;
    int o = 0;
    std::string zwykly;
    static char zakodowane[30];
    enigma obiekt;

    // =============================================
    srand( time( NULL ) );
    char tablica[ 31 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'w', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9','\0'};
    obiekt.menu();
    std::cout <<"\nWybierz dzialanie: ";
    std::cin >> opcja;

    switch (opcja)
    {
        case 1:

            obiekt.tekst;
            cout <<"\n\nPodaj tekst do zaszyfrowania: ";
            getline(cin, obiekt.tekst); // pobiera tekst od uzytkownika
            std::cout <<"\n\n";
            obiekt.znaki = obiekt.tekst.length(); // przypisanie zmiennej znaki wartosci odpowiadajacej ilosci znakow w tekscie
            std::cout <<"\nWylosowano nastepujace liczby:  ";
            for ( int i = 0; i < obiekt.znaki; i++ ) 
               {
                  obiekt.wylosowane =( rand() % 31 ) + 0;
                  a++;
                  b[a] = obiekt.wylosowane;
                  std::cout << b[a] <<" ";
               }

            for( int p = 0; p < obiekt.znaki; p++ ) 
            {
                d++;
                gotowe_liczby[d] = b[d] + losowa_tablica[d];
                std::cout << gotowe_liczby[d];

            }
            while (o < obiekt.znaki)
            {
                o++;
                std::cout << tablica[gotowe_liczby[o]];
                std::cout << "\n" << zakodowane[o];
            }

    }

}
[/code]
edytowany 2x, ostatnio: dejmien, 2013-11-26 18:05

Pozostało 580 znaków

2013-11-26 19:38

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

Dziwna sprawa ale zauważyłem że to nie działa gdy: getline (cin, enigma.tekst); jest umieszczony w switch case 1. Gdy umieszcze to getline przed switch to działa dziwne.

Pozostało 580 znaków

2013-11-26 19:47

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

1

Dodaj

 cin.ignore(); 

po std::cin >> opcja;

Pozostało 580 znaków

2013-11-26 19:50

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

WoW działa. A mam jeszcze taką prośbę... dlaczego to tak... co to robi... jak to robi....po co to robi... :-P Pierwszy raz się z tym spotkałem i chce się tego nauczyć aby później nie robić takich błędów. W książce o tym nie napisali.

Pozostało 580 znaków

2013-11-26 20:16

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

Wiąże się to z tym, że operator cin >> i funkcja getline wczytują znaki w odmienny sposób. Mianowicie po użyciu operatora >> wciskasz enter, co odpowiada znakowi nowej linii (\n), czyli tzw. białemu znakowi. Operator ten zignoruje ten znak, ale pozostanie on w strumieniu wejściowym.
Następnie wywołujesz funkcję getline, która tych białych znaków nie ignoruje,a ponadto jej trzeci argument formalny to tzw. ogranicznik. Po napotkaniu przez funkcje tego znaku przerywa ona pracę. Przez domniemanie jest to znak nowej linii. Więc w twoim programie wywołujesz getline bezpośrednio po operatorze >>. Napotyka ona pozostały tam znak nowej linii i przerywa pracę.
Funkcją ignore możesz pozbyć się aktualnej zawartości strumienia, co rozwiązuje ten problem.

edytowany 1x, ostatnio: Jerylee, 2013-11-26 20:17

Pozostało 580 znaków

2013-11-26 22:12

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

0

Dzięki wielkie teraz już będę wiedział. Taka ważna rzecz a w książkach tego nie ma....

Pozostało 580 znaków

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