Problem z string'iem w switchu i if'ie
Ostatnio zmodyfikowano 2013-04-28 13:36
wuldemar95 Temat założony przez niniejszego użytkownika |
Problem z string'iem w switchu i if'ie » 2013-04-28 10:30:34 Witam! Mam mały problem, mam jutro sprawdzian z tablic znakowych i będę musiał utworzyć MENU z wykorzystaniem switcha, jednak gdy wrzuce kod w switcha to po kompilacji i uruchomieniu program wypisuje tylko to co umieściłem w cout, bez możliwości wprowadzenia jakichkolwiek danych, po czym się kończy. Jeśli ten sam kod wrzucę w IF'a, dzieje się to samo.. Używam Dev-C++ 5.2.0.3 Oto kod: #include <cmath> #include <iostream> #include <cstdlib> using namespace std;
void jeden(); int main() { cout << " M E N U\n"; cout << " 1. Wypisywanie tekstu w odwrotnej kolejnosci.\n"; int q; cout << " Wybierz nr zadania: "; cin >> q; switch( q ) { case 1: { jeden(); } break; default: cout << "\n\n Nie ma takiego zadania!\n\n"; } system( "PAUSE" ); return 0; };
void jeden() { string tekst; cout << "\n\n Wypisuje tekst w pionie i w odwrotnej kolejnosci.\n\n"; cout << " Wprowadz tekst: "; getline( cin, tekst ); cout << "\n"; unsigned short int dl; dl = tekst.length(); for( int i = dl; i >= 0; i-- ) cout << tekst[ i ] << "\n"; cout << "\n\n"; } Dodam jeszcze że gdy nie używam funkcji tylko wrzucę kod bezpośrednio do switcha dzieje się to samo.. PROSZĘ O SZYBKĄ POMOC! Z góry dziękuję! |
|
Berux |
» 2013-04-28 11:06:52 1. Kod umieść pomiędzy znacznikami: [cpp][/cpp] 2. Czyż nie czytelniej byłoby umieszczanie każde instrukcji w osobnej linii? To nie jest jakiś błąd, tylko chodzi mi tu o czytelność kodu. Chyba, że tak wolisz. 3. Nie polecam używanie system( "PAUSE" ); 4. Wrzuć cin.sync(); przed getline i będzie działało 5. Nie wiem czy o to chodzi w tym programie, ale czy program nie powinien wypisywać każdej litery wyrazu w osobnej linii? Jeśli tak, to zamiast string'a zastosuj tablicę char lub przekonwertuj string na char. 6. break; umieszczaj w bloku, który odpowiada danemu case'owi, a nie za blokiem: Zamiast: napisz: Jeśli coś źle napisałem, to poprawcie. :D PS Powodzenia na sprawdzianie :) |
|
Canar |
» 2013-04-28 11:07:14 for( int i = dl - 1; i >= 0; i-- ) dl - 1, bo pokazujesz na pole poza stringiem, bo nie liczy od zera (tak mi sie wydaje) cout << tekst[ i ] << "\n"; bo od końca po kolei lecisz. Możesz tak jak napisałem zrobić, bo ze stringiem, tak jak z tablicą charów możesz wywoływać. |
|
Berux |
» 2013-04-28 11:09:27 @Canar
Dobrze mówisz(piszesz). Tylko "tekst" musi być tablicą char . |
|
Canar |
» 2013-04-28 11:20:59 Podsumowując: for( int i = dl - 1; i >= 0; i-- ) cout << tekst[ i ] << endl;
#include <string> #include <iostream> A reszta, nie mam pojęcia po co Ci ;) Był gotowiec, ale użytkownik na dole ma racje. |
|
Berux |
» 2013-04-28 11:24:30 Rzeczywiście. Masz rację. Tylko nie potrzebnie dałeś gotowca - lepiej, żeby autor tematu sam na to wpadł, wtedy się więcej nauczy. |
|
pekfos |
» 2013-04-28 12:01:52 6. break; umieszczaj w bloku, który odpowiada danemu case'owi, a nie za blokiem: |
To nie ma znaczenia. |
|
RazzorFlame |
» 2013-04-28 13:01:36 BTW. Tomczyk nie ma znaczenia czy przekonwertujesz stringa na tablice char bo tak naprawde string to klasa (dziedzicząca jeden z kontenerów STL-a) z tymi twoimi char-ami. Nie podawaj błędnych odpowiedzi. Zanim to napisałeś mogłeś sprawdzić w dokumentacji operator "[]". Zwraca i-ty znak z kontenera (tu stringa). Tak więc ten zapis: string tekst;
char * znaki =( char * ) tekst.c_str(); for( int i = 0; znaki[ i ] != '/0'; i++ )
Jest równoważny z: string tekst;
for( int i = 0; tekst[ i ] != '/0'; i++ )
Tylko 2 sposób jest krótszy i łatwiejszy :P |
|
« 1 » 2 |