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

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?

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

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

0

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

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]
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.

1

Dodaj

 cin.ignore(); 

po std::cin >> opcja;

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.

1

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.

0

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

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