getline() werkt niet indien gebruikt na enkele invoer

Mogelijk duplicaat:
Hulp nodig met getline()

getline()werkt niet, als ik het gebruik na wat invoer, bijv.

#include<iostream>
using namespace std;
main()
{
string date,time;
char journal[23];
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;
cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<endl;
system("pause");
}

waar het lijkt alsof ik getline()bovenop invoer gebruik, het werkt, d.w.z.

cout<<"Journal Entry:\t";
cin.getline(journal,23);
cout<<"Date:\t";
cin>>date;
cout<<"Time:\t";
cin>>time;

Wat kan de reden zijn?


Antwoord 1, autoriteit 100%

Tekens worden geëxtraheerd totdat een van de (n – 1) tekens is
geëxtraheerd of het scheidingsteken is gevonden (wat een scheidingsteken is als dit
parameter is opgegeven, of anders ‘\n’). De extractie stopt ook
als het einde van het bestand is bereikt in de invoerreeks of als er een fout is opgetreden
gebeurt tijdens de invoerbewerking.

Als cin.getline()de invoer leest, blijft er een teken voor een nieuwe regel over in de invoerstroom, zodat uw c-string niet wordt gelezen. Gebruik cin.ignore()voordat je getline()aanroept.

cout<<"Journal Entry:\t";
cin.ignore();
cin.getline(journal,23);

Antwoord 2, autoriteit 17%

Toevoegen aan wat @DavidHammen zei:

De extractiebewerkingen laten het teken '\n'achter in de stream. Aan de andere kant, istream::getline()negeert het. Dus als je getlineaanroept na een extractie-operator, is '\n'het eerste teken dat het tegenkomt en stopt het lezen daar.

Plaats dit na voor getlineoproepextractie:

cin.ignore()

Een robuustere manier om input te krijgen zou er ongeveer zo uitzien:

while (true) {
    cout<<"Time:\t";
    if (cin>>time) {
        cin.ignore();  // discard the trailing '\n'
        break;
    } else {
        // ignore everything or to the first '\n', whichever comes first
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.clear();  // clear the error flags
        cout << "Invalid input, try again.\n";
    }
}

Antwoord 3, autoriteit 3%

Je controleert de streamstatus niet. De std::cinstream extractie-operator (operator>>) kan mislukken. Als dit het geval is, wordt de stream gemarkeerd als “slecht” (failbit, badbitof eofbitzijn ingesteld). Eenmaal “slecht” zullen alle volgende stream-extracties op die stream mislukken, tenzij u de status wist.

Leer een paranoïde programmeur te zijn. Controleer altijd de status van die geformatteerde invoerbewerkingen. U kunt bijvoorbeeld een uitzondering genereren of een foutmelding afdrukken en afsluiten. Het enige wat je niet moet doen, is gewoon aannemen dat het werkte.

Other episodes