Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

std::cin - sprawdzanie co się pod nim kryje

Ostatnio zmodyfikowano 2017-04-01 12:37
Autor Wiadomość
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:

C/C++
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 :/
P-159601
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:
C/C++
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.
P-159607
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:

C/C++
#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.


P-159622
karambaHZP
» 2017-03-31 00:28:18
istringstream iss( s );
 ?
P-159626
j23
» 2017-03-31 10:34:43
W całości:
C/C++
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 );
P-159634
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

C/C++
#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;
}
P-159651
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.
P-159652
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 :)
P-159653
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona