• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego getline(cin ,imie); nie działa?

Object Storage Arubacloud
0 głosów
1,058 wizyt
pytanie zadane 28 maja 2015 w C i C++ przez DavidMCPolska Bywalec (2,770 p.)
edycja 28 maja 2015 przez DavidMCPolska

Użyłem getline(cin, imie); z 8 odcinka i program nawet nie daje mi wpisać niczego. Chodzi o to, że najpierw miałem cin << imie; i potem na getline(cin, imie); zamieniłem, żeby cała linia się wczytała, a nie tylko pierwszy wyraz. Gdy w programie chcę wpisać coś to piszę i ciągle kreska miga i program ma w dupie to co wpisuję na klawiaturze i nic się nie pokazuje na ekranie, tak jakbym nic nie robił. Oto fragment kodu:

if (polecenie == 1)
		{
			system("cls");
			changecol(10);
			cout << "===========================Wpisz swoje imię lub wyraz===========================";

			string imie;
			cout << endl << endl << endl;

			getline(cin,imie);

			transform(imie.begin(), imie.end(), imie.begin(), ::toupper);
			int liczba[20];
			int i2;
			int dlugosc = imie.length();
			for (i2 = 0; i2 < dlugosc; i2++)
			{       //To co jest pod kodem na pomarańczowo to chodzi mi właśnie o to co jest od tąd do z
				if (imie[i2] == 'A')
				{
					liczba[i2] = 1;
				}
				if (imie[i2] == 'B')
				{
					liczba[i2] = 2;
				}
				if (imie[i2] == 'C')
				{
					liczba[i2] = 3;
				}
				if (imie[i2] == 'D')
				{
					liczba[i2] = 4;
				}
				if (imie[i2] == 'E')
				{
					liczba[i2] = 5;
				}
				if (imie[i2] == 'F')
				{
					liczba[i2] = 6;
				}
				if (imie[i2] == 'G')
				{
					liczba[i2] = 7;
				}
				if (imie[i2] == 'H')
				{
					liczba[i2] = 8;
				}
				if (imie[i2] == 'I')
				{
					liczba[i2] = 9;
				}
				if (imie[i2] == 'J')
				{
					liczba[i2] = 10;
				}
				if (imie[i2] == 'K')
				{
					liczba[i2] = 11;
				}
				if (imie[i2] == 'L')
				{
					liczba[i2] = 12;
				}
				if (imie[i2] == 'M')
				{
					liczba[i2] = 13;
				}
				if (imie[i2] == 'N')
				{
					liczba[i2] = 14;
				}
				if (imie[i2] == 'O')
				{
					liczba[i2] = 15;
				}
				if (imie[i2] == 'P')
				{
					liczba[i2] = 16;
				}
				if (imie[i2] == 'Q')
				{
					liczba[i2] = 17;
				}
				if (imie[i2] == 'R')
				{
					liczba[i2] = 18;
				}
				if (imie[i2] == 'S')
				{
					liczba[i2] = 19;
				}
				if (imie[i2] == 'T')
				{
					liczba[i2] = 20;
				}
				if (imie[i2] == 'U')
				{
					liczba[i2] = 21;
				}
				if (imie[i2] == 'V')
				{
					liczba[i2] = 22;
				}
				if (imie[i2] == 'W')
				{
					liczba[i2] = 23;
				}
				if (imie[i2] == 'X')
				{
					liczba[i2] = 24;
				}
				if (imie[i2] == 'Y')
				{
					liczba[i2] = 25;
				}
				if (imie[i2] == 'Z')
				{
					liczba[i2] = 26;
				}
				cout << liczba[i2];
			}
			Sleep(10000);
			
		}

I powiedzcie też jeśli znacie lepszy sposób na te wszystkie litery które zapisują odpowiednią liczbę zmiennej... :D

4 odpowiedzi

+1 głos
odpowiedź 28 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
wybrane 29 maja 2015 przez DavidMCPolska
 
Najlepsza

Uuuu... Nie ciekawie to wygląda... Po co tyle ifów ? W każdym z nich robisz praktycznie to samo...

Popatrz na to, http://www.asciitable.com/ tą tabelę można wykorzystać!

for (i2 = 0; i2 < dlugosc; i2++)
{
  if(imie[i2] >= 'A' && imie[i2] <= 'Z')
    liczba[i2] = static_cast<int>(imie[i2] - 64);
}

 

Przy okazji, getline działa, tylko użyj tych tricków:

https://forum.pasja-informatyki.pl/11267/problem-z-getline?show=11267#q11267

https://forum.pasja-informatyki.pl/5572/getline-i-cin-ignore?show=5572#q5572

komentarz 28 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

Hi hi hi, wiedziałem, że pewnie jest jakiś lepszy sposób którego jeszcze nie znam..... :((

PS: a jak będę chciał jeszcze polskie znaki tam wczytać??

komentarz 28 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)
edycja 28 maja 2015 przez DavidMCPolska

Sztuczka działa, ale przy użyciu tablicy ASCII chyba nie wczyta polskich znaków, a nawet gdyby wczytał to na polskie znaki chciałem dać liczby z przecinkiem albo np tak. A = 1 ą = 1 itd

sory już to napisałeś kiedy ja to pisałem, właśnie o to mi chodzi.

komentarz 28 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
uu... może tutaj coś znajdziesz... http://cpp0x.pl/forum/temat/?id=14148 Chodzi Ci o konwersję polskich znaków na cyfrę ? Tak, by litera 'Ą' odpowiadała cyfrze 1 tak ?
+1 głos
odpowiedź 28 maja 2015 przez Dorion300 Szeryf (90,250 p.)

Optymalizacja kodu aby nie było tyle ifów.

    const int tabD = 26;
    char tab[tabD] = {'A','B','C','D','E','F','G','H','I','J',
    'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};


    system("cls");
    cout << "===========================Wpisz swoje imię lub wyraz===========================";

    string imie;
    cout << endl << endl << endl;

    getline(cin,imie);

    transform(imie.begin(), imie.end(), imie.begin(), ::toupper);
    int liczba[20];
    int dlugosc = imie.length();
    for (int i2 = 0; i2 < dlugosc; i2++)
    {
        for(int i3=0; i3<tabD;i3++)
        {
            if(imie[i2] == tab[i3]) liczba[i2] = i3+1;
        }
        cout << liczba[i2];
    }
    Sleep(10000);

 

komentarz 28 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

To działa tylko jeszcze muszę wymyślić sposób na polskie znaki... Spróbuje sam to zrobić, bo nie mogę ciągle się pytać.

komentarz 29 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

A możesz mi jeszcze wytłumaczyć jak działa to?

const int tabD = 27;
char tab[tabD] = { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

 

Wiem, przerobiłem to trochę żeby dla spacji było 0 i oczywiście w późniejszym for usunąłem z liczba i2 = i3 + 1 usunąłem +1

komentarz 29 maja 2015 przez Dorion300 Szeryf (90,250 p.)
W pustym '' daj spację.

I powinno wszystko pięknie działać.

Pierwszy For Jedzie po kolei z literami.

A drugi For sprawdza pojedyńczą literę gdzie leży jego odpowiednik w tablicy a następnie przypisuje do innej tablicy jego miejsce.
komentarz 29 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

Ale chodzi mi o to: |                                                                                       \/

const int tabD = 27;
            char tab[tabD] = { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

komentarz 29 maja 2015 przez Dorion300 Szeryf (90,250 p.)
"const int tabD = 27" to stała którą nie można podczas działania programu zmieniać (wywala nam wtedy bład).

Można było by zrobić tak: "char tab[]" ale wtedy nie mamy pewności czy program będzie prawidłowo działał, gdyż może się okażać że jest za dużo liter albo za mało.

więc "char tab[tabD]" jest lepszym sposobem gdyż kompilator nas ochrzani jeśli za dużo liter wpiszemy.

Lepiej zapomnieć dalszej częsci tablicy niź przekroczyć ją.

Oczywiście tabD jest potrzebny jeszcze w dalszej częsci programu.
komentarz 29 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

Dziękuje za przydatne informacje, lubię gdy ktoś pomaga. Ja jak będę więcej umiał też będe pomagał na tym forum :)

0 głosów
odpowiedź 28 maja 2015 przez Adrian1999 Nałogowiec (34,570 p.)

I powiedzcie też jeśli znacie lepszy sposób na te wszystkie litery które zapisują odpowiednią liczbę zmiennej... :D

Funkcja Switch(); 

Gdy w programie chcę wpisać coś to piszę i ciągle kreska miga i program ma w dupie to co wpisuję na klawiaturze

Więc 1. Kulturki :D po prostu ignoruje cię 2. ignoruje cie ponieważ ,,Sleep(10000);" po polsku pisząc musisz czekać 10 sekund, 

komentarz 28 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)
No, ale nawet jak usunę Sleepa to jak w menu głównym (którego nie załączyłem w kodzie) wpisze 1 to od razu wywala mnie znowu do menu.

To tak jakby program nawet nie czekał aż wpiszę coś
komentarz 28 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)

Chyba muszę zrezygnować z getline

0 głosów
odpowiedź 30 maja 2015 przez DavidMCPolska Bywalec (2,770 p.)
edycja 30 maja 2015 przez DavidMCPolska

Hello, ten kod ma zamienić polskie znaki na zwykłe litery, w sensie, że cyfrze 'A' odpowiada liczba 1 i liczbie 'Ą' odpowiada liczba 1 tak samo 'C' to 3 i 'Ć' to 3.

if (polecenie == 1)
		{
			const int tabD = 36;
			char tab[tabD] = { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż' };

			changecol(10);
			system("cls");
			cout << "===========================Wpisz swoje imię lub wyraz===========================";

			string imie;
			cout << endl << endl << endl;

			cin.ignore();
			getline(cin, imie);

			transform(imie.begin(), imie.end(), imie.begin(), ::toupper);



			int liczba[20];
			int dlugosc = imie.length();
			for (int i2 = 0; i2 < dlugosc; i2++)
			{
				for (int i3 = 0; i3<tabD; i3++)
				{
					if (imie[i2] == tab[i3]) liczba[i2] = i3;
				}
				if (liczba[i2] == 27) liczba[i2] = 1; else if (liczba[i2] == 28) liczba[i2] = 3; else if (liczba[i2] == 29) liczba[i2] = 5; else if (liczba[i2] == 30) liczba[i2] = 12; else if (liczba[i2] == 31) liczba[i2] = 14; else if (liczba[i2] == 32) liczba[i2] = 15; else if (liczba[i2] == 33) liczba[i2] = 19; else if (liczba[i2] == 34) liczba[i2] = 26; else if (liczba[i2] == 35) liczba[i2] = 1;
				cout << liczba[i2];
			}
			cout << endl << endl << "                                  Obliczanie...";
			Sleep(2000);
			
		}

Co jest nie tak w tym kodzie, że gdy wpisuje ą to pisze 1, a gdy już inne polskie znaki piszę to wyskakują mi jakieś ujemne cyfry tak jak na zdjęciu, albo polskim znakom wypisuje złe cyfry np ć to 2, a c to 3. Nie wiem czemu taki niewyraźny obraz, chyba Pan Mirosław zmniejsza rozdzielczość, żeby mu limitu nie zżarło :D. W ogóle bardzo słaby chyba jestem w programowaniu jak ciągle mam jakieś problemy.

Podobne pytania

+1 głos
4 odpowiedzi 2,027 wizyt
pytanie zadane 7 sierpnia 2015 w PHP przez migacz100 Mądrala (5,410 p.)
+5 głosów
2 odpowiedzi 1,834 wizyt
pytanie zadane 11 kwietnia 2015 w C i C++ przez hakiros54 Obywatel (1,160 p.)
0 głosów
2 odpowiedzi 159 wizyt
pytanie zadane 14 października 2016 w C i C++ przez Kuba321 Użytkownik (730 p.)

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...