2015-11-04 8 views
7

Napisałem ten kod w C++ w IDE CodeBlocks, ale kiedy go uruchomię, nie daje mi -1, jeśli nie czyta liczby, to daje mi 0. Czy coś jest nie tak z kodem?Wartość domyślna dla zmiennej w C++ przy użyciu cin >>

#include "iostream" 

using namespace std; 

int main() 
{ 
    cout<<"Please enter your first name and age:\n"; 
    string first_name="???"; //string variable 
          //("???" means "don't know the name") 
    int age=-1; //integer variable (-1 means "don't know the age") 
    cin>>first_name>>age; //read a string followed by an integer 
    cout<<"Hello, " <<first_name<<" (age "<<age<<")\n"; 

    return 0; 
} 
+2

Opcja 'operator <<()' 'age' ustawi się jego wartość domyślna (czyli' 0' w tym przypadku) i nadpisania '-1' kiedy nie może odczytać liczby. To normalne zachowanie. –

+1

@ πάνταῥεῖ Masz na myśli 'operator >>', prawda? – Angew

+1

http://pl.cppreference.com/w/cpp/io/basic_istream/operator_gtgt Cytat: 'od C++ 11: Jeśli wyodrębnianie nie powiedzie się, zero jest zapisywane do wartości i ustawia się failbit' – bolov

Odpowiedz

11

Zachowanie std::basic_istream::operator>> zmieniła się od C++ 11. Ponieważ C++ 11,

Jeśli wyodrębnianie nie powiedzie się, zero jest zapisywane do wartości i ustawiany jest błąd awaryjny. Jeśli wyodrębnienie spowoduje, że wartość będzie zbyt duża lub zbyt mała, aby zmieścić się w wartości , zostanie zapisana wartość std :: numeric_limits :: max() lub std :: numeric_limits :: min() i ustawiona flaga błędu.

Należy pamiętać, że dopóki C++ 11,

Jeśli ekstrakcja nie powiedzie się (na przykład, jeżeli pismo zostało wpisane gdzie cyfra jest oczekiwano), wartość zostaje modyfikowany i failbit jest ustawiony.

Możesz sprawdzić wynik przez std::basic_ios::fail lub std::basic_ios::operator! i ustawić domyślną wartość samodzielnie. Takie jak

string first_name; 
if (!(cin>>first_name)) { 
    first_name = "???"; 
    cin.clear(); //Reset stream state after failure 
} 

int age; 
if (!(cin>>age)) { 
    age = -1; 
    cin.clear(); //Reset stream state after failure 
} 

cout<<"Hello, " <<first_name<<" (age "<<age<<")\n"; 

Zobacz także: Resetting the State of a Stream

+1

Chciałbym adres OP, w jaki sposób sprawdzić failbit (a następnie ustawić wartość domyślną). Wskazywałbym też [tutaj: Resetowanie stanu strumienia] (http://stackoverflow.com/questions/11246960/resetting-the-state-of-a-stream) – Antonio

+0

Myślę, że OP jest bardziej zainteresowany ustawianiem domyślna wartość w tym przypadku. (I zresetowałbym status strumienia) – Antonio

+0

Kto jest OP? I dlaczego, gdy poprosiłem mojego przyjaciela, aby napisał ten sam kod w Visual Studio 2015, dał mu '-1', gdyby nie przeczytał numeru? Czy jest coś w IDE? @songyuanyao – Alberto

0

Nie ma obsługi niestandardowych wartości domyślnych podczas odczytu z std::cin. Musisz odczytać dane wejściowe użytkownika jako ciąg znaków i sprawdzić, czy są puste. Aby uzyskać szczegółowe informacje, patrz this question.

Cytując połączonego pytanie:

int age = -1; 
std::string input; 
std::getline(std::cin, input); 
if (!input.empty()) { 
    std::istringstream stream(input); 
    stream >> age; 
} 
Powiązane problemy