Frage

Ich bin ein kleines Programm für die persönlichen Gebrauch zu schreiben C üben Lernen ++ und für seine Funktionalität, ein MLA Zitat Generator (Ich bin ein großes Papier mit Dutzenden von Zitaten zu schreiben).

In Ermangelung eines besseren Weg, es zu tun (ich verstehe nicht, Klassen oder mit anderen CPP-Dateien in Ihrem Haupt, so nicht die Mühe, mir zu sagen, ich werde daran arbeiten, wenn ich mehr Zeit habe), ich schreibe eine Funktion für jede Art des Zitierens. Ich könnte diese brechen für jeden wiederverwendet Code in eine Funktion ab, wenn ich mehr Zeit bekommen.

Meine Frage ist: Wie funktioniert das std :: cin Objekt Arbeit? Ich lese zur Zeit mit std :: cin >> für die Saiten Ich erwarte, dass einzelne Worte zu sein, und getline (std :: cin, string) für die Saiten mit Leerzeichen. Ich bin nicht die richtige Ausgabe bekommen, though. Ich will nur wissen, wie std :: cin funktioniert und warum ich unerwartet immer einige einige Eingaben übersprungen (zB es über webPage springt statt mir eine Chance zur Eingabe hinein geben).

void webCit()
{
std::cout << "Leave any unknowns blank.\n";

std::cout << "Author last name: ";
std::string lastName;
std::cin >> lastName;

if (lastName.size() != 0)
{
    lastName = lastName + ", ";    
}


std::cout << "Author first name: ";
std::string firstName;
std::cin >> firstName;

if (firstName.size() != 0)
{
    firstName = firstName + ". ";
}


std::cout << "Article title: ";
std::string articleTitle;
getline(std::cin, articleTitle);

if (articleTitle.size() != 0)
{
    articleTitle = "\"" + articleTitle + ".\" ";
}

std::cout << "Title of web page: ";
std::string pageTitle;
std::cin >> pageTitle;

if(pageTitle.size() != 0)
{
    pageTitle = pageTitle + ". ";
}

std::cout << "Publication date: ";
std::string publicationDate;
getline(std::cin, publicationDate);

if(publicationDate.size() != 0)
{
    publicationDate = publicationDate + ". ";

} 

std::cout << "Web address: ";
std::string webAddress;
getline(std::cin, webAddress);

webAddress = "<" + webAddress + ">. ";

std::cout << "Date accessed: ";
std::string dateAccessed;
getline(std::cin, dateAccessed);

if(dateAccessed.size() != 0)
{
    dateAccessed = dateAccessed + ". ";
}

std::string citation =
    lastName + firstName + articleTitle + pageTitle + publicationDate + webAddress + dateAccessed;

std::cout << citation; //TEST; remove after
}

EDIT: I / O

Leave any unknowns blank.
Author last name: Hooked
Author first name: Jerbear
Article title: Title of web page: title
Publication date: Web address: www.win.com
Date accessed: 4/29/09
Hooked, Jerbear. Title. <www.win.com>. 4/29/09. 

Wie Sie sehen können, was falsch läuft, weil meine Eingabe wird immer übersprungen.

War es hilfreich?

Lösung

Was ist hier passiert, ist, dass std::cin >> firstName; nur zu liest, aber nicht einschließlich die ersten Leerzeichen, die die Neuen-Zeile (oder '\n') enthält, wenn Sie die Eingabetaste drücken, so, wenn es um getline(std::cin, articleTitle); bekommt, '\n' noch das nächste Zeichen in std::cin ist, und getline() kehrt sofort zurück.

// cin = "Bloggs\nJoe\nMan of Steel, Woman of Kleenex\n"
std::cin >> lastName;
std::cin >> firstName;
// firstName = "Joe", lastName = "Bloggs", cin = "\nMan of Steel, Woman of Kleenex\n"
getline(std::cin, articleTitle);
// articleTitle = "", cin = "Man of Steel, Woman of Kleenex\n"

Hinzufügen von 'std::cin >> std::ws' (ws Bedeutung whitespace), bevor Sie Ihre Anrufe zu getline () behebt das Problem:

std::cin >> firstName >> std::ws;
getline(std::cin, articleTitle);

Aber es ist einfacher zu sehen, wo Sie es verpasst haben, wenn Sie es in der Argumentation zu tun:

std::cin >> firstName;
getline(std::cin >> std::ws, articleTitle);

Andere Tipps

Wenn Sie den >> Operator verwenden, cin liest bis zum nächsten Leerzeichen, aber es nicht verarbeitet das Leerzeichen. Also, wenn Sie

std::cin >> str1;
std::getline(std::cin, str2);

Der zweite Anruf wird nur die Newline-Zeichen verarbeiten, und Sie haben keine Chance, jede Eingabe eingeben.

Stattdessen, wenn Sie getline nach einem operator >> verwenden planen, können Sie std::cin.ignore() rufen Sie das Newline zu essen, bevor Sie getline nennen.

Edit: es funktioniert, wie Sie erwartet, wenn Sie tun

std::cin >> str1;
std::cin >> str2;

, da der zweite Anruf wird alle führenden Leerzeichen ignorieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top