std::cin - sprawdzanie co się pod nim kryje
Ostatnio zmodyfikowano 2017-04-01 12:37
Qabrix Temat założony przez niniejszego użytkownika |
» 2017-03-30 14:51:56 j23, niee, nie do końca :/ w sumie nie do końca jasno teraz się wyraziłem, chciałbym żeby pierwszy element tablicy był jednym słowem, a wszystko po spacji drugim. W sumie ten zapis spełnia role: for( int i = 0; i < 6; i++ ) { if( i % 2 == 0 ) { cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": "; cin >> nazwa[ i ]; } else cin.get( nazwa[ i ], rozmiar ); }
Jednak właśnie, jeżeli ktoś postąpi wbrew intencjom programisty i wpisze tylko jeden wyraz i nic po spacji, to program się buguje. I to chciałbym własnie zabezpieczyć. A karambaHZP, niestety Twoje rozwiązanie nie jest adekwatne do pytania :/ |
|
j23 |
» 2017-03-30 18:49:45 No to zrób drobną modyfikację tego, co podałem: getline( iss >> tab[ 0 ], tab[ 1 ] ); Możesz po getline dodać taki kod: auto it = tab[ 1 ].begin(); while( it != tab[ 1 ].end() && isspace( * it ) ) ++it;
tab[ 1 ].erase( tab[ 1 ].begin(), it );
żeby usunąć spacje na początku drugiego stringa. |
|
Qabrix Temat założony przez niniejszego użytkownika |
» 2017-03-30 23:22:29 Dzięki za odpowiedź (po raz kolejny ;)), ale jeszcze tylko ostatnie pytanie. Napisałem taki oto kod, aby sprawdzić, czy to rozwiązanie działa: #include<cstdlib> #include <iostream> #include <conio.h> #include<string> #include <cstdio> #include <cstring> int main() { using namespace std; char tab[ 2 ][ 50 ]; string s; getline( iss >> tab[ 0 ], tab[ 1 ] ); iss >> tab[ 0 ] >> tab[ 1 ]; cout << tab[ 0 ] << endl << tab[ 1 ]; } Ale niestety, podczas kompilacji otrzymuje błąd: error: 'iss' was not declared in this scope Gdybyś jeszcze tylko mógł mi to wyjaśnić, byłbym ogromnie wdzięczny. |
|
karambaHZP |
» 2017-03-31 00:28:18 istringstream iss( s ); ? |
|
j23 |
» 2017-03-31 10:34:43 W całości: string tab[ 2 ]; string s;
getline( cin, s ); istringstream iss( s ); getline( iss >> tab[ 0 ], tab[ 1 ] );
auto it = tab[ 1 ].begin(); while( it != tab[ 1 ].end() && isspace( * it ) ) ++it;
tab[ 1 ].erase( tab[ 1 ].begin(), it );
|
|
Qabrix Temat założony przez niniejszego użytkownika |
» 2017-03-31 18:08:14 Dostaje takie ostrzeżenia i błędy: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat] error: 'it' does not name a type error: 'it' was not declared in this scope #include <iostream> #include <cstdio> #include <string> #include <sstream>
using namespace std;
int main() { using namespace std; string tab[ 2 ]; string s; getline( cin, s ); istringstream iss( s ); getline( iss >> tab[ 0 ], tab[ 1 ] ); auto it = tab[ 1 ].begin(); while( it != tab[ 1 ].end() && isspace( * it ) ) ++it; tab[ 1 ].erase( tab[ 1 ].begin(), it ); return 0; }
|
|
j23 |
» 2017-03-31 18:34:14 Włącz w opcjach projektu obsługę standardu C++11 (lub wyżej). Ewentualnie zamiast auto daj string::iterator. |
|
Qabrix Temat założony przez niniejszego użytkownika |
» 2017-03-31 20:13:48 Dzięki j23, wszystko teraz działa tak jak powinno :) |
|
1 « 2 » 3 |