Getline() gebruiken in C++

Ik heb een probleem bij het gebruik van de getline-methode om een bericht te krijgen dat de gebruiker typt, ik gebruik zoiets als:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

Het stopt echter niet om de uitvoerwaarde te krijgen, wat is hier mis mee?


Antwoord 1, autoriteit 100%

Als u getline()gebruikt na cin >> something, moet je het teken van de nieuwe regel uit de buffer ertussen spoelen. U kunt dit doen door cin.ignore()te gebruiken.

Het zou ongeveer zo zijn:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

Dit gebeurt omdat de operator >>een teken voor een nieuwe regel \nin de invoerbuffer achterlaat. Dit kan een probleem worden als je ongeformatteerde invoer doet, zoals getline(), die invoer leest totdat een nieuwe regel wordt gevonden. Als dit gebeurt, stopt het onmiddellijk met lezen, vanwege die \ndie daar bleef hangen tijdens uw vorige bewerking.


Antwoord 2, autoriteit 6%

Als je maar één nieuwe regel in de invoer hebt, gewoon doen

std::cin.ignore();

zal prima werken. Het leest en verwijdert het volgende teken van de invoer.

Maar als u naast de nieuwe regel nog iets anders in de invoer heeft (u leest bijvoorbeeld één woord maar de gebruiker heeft twee woorden ingevoerd), dan moet u dat doen

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Zie bijv. deze verwijzing naar de functie ignore.

Om nog veiliger te zijn, voert u het tweede alternatief hierboven in een lus uit tot gcountgeeft nul terug.


Antwoord 3, autoriteit 4%

Ik had soortgelijke problemen. Het enige nadeel is dat je met cin.ignore()nog 1 keer op enter moet drukken, wat het programma verstoort.


Antwoord 4, autoriteit 2%

int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}

Antwoord 5

Ik weet dat ik laat ben, maar ik hoop dat dit nuttig is.
Logica is voor het nemen van één regel tegelijk als de gebruiker veel regels wil invoeren

int main() 
{ 
int t;                    // no of lines user wants to enter
cin>>t;
string str;
cin.ignore();            // for clearing newline in cin
while(t--)
{
    getline(cin,str);    // accepting one line, getline is teminated when newline is found 
    cout<<str<<endl; 
}
return 0; 
} 

invoer:

3

Overheidscollage Berhampore

Serampore textielcollage

Berhampore Serampore

uitvoer:

Overheidscollage Berhampore

Serampore textielcollage

Berhampore Serampore


Antwoord 6

Ik denk dat je het programma niet pauzeert voordat het eindigde, dus de uitvoer die je doet nadat je de inpus hebt gekregen, ziet niet op het scherm rechts?

DOEN:

getchar();

Vóór het einde van het programma


Antwoord 7

De code is correct. Het probleem moet ergens anders liggen. Probeer het minimalistische voorbeeld van de Documentatie van de STD :: Getline.

main ()
{
    std::string name;
    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";
    return 0;
}

Other episodes