Domanda

Sto scrivendo un piccolo programma per il mio uso personale per esercitarmi nell'apprendimento del C ++ e per la sua funzionalità, un generatore di citazioni MLA (sto scrivendo un grande documento con decine di citazioni).

Per mancanza di un modo migliore per farlo (non capisco le lezioni o utilizzo altri file .cpp nel tuo main, quindi non preoccuparti di dirmelo, ci lavorerò quando avrò più tempo), Sto scrivendo una funzione per ogni tipo di citazione. Potrei scomporlo in una funzione per ciascun codice riutilizzato se avessi più tempo.

La mia domanda è: come funziona l'oggetto std :: cin? Attualmente sto leggendo con std :: cin > > per le stringhe mi aspetto di essere singole parole e getline (std :: cin, string) per le stringhe con spazi. Tuttavia, non sto ottenendo il risultato giusto. Voglio solo sapere come funziona std :: cin e perché continuo a saltare inaspettatamente su alcuni input (ad esempio, salta su WebPage invece di darmi la possibilità di inserirvi).

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. 

Come puoi vedere, qualcosa non va, perché il mio input viene ignorato.

È stato utile?

Soluzione

Quello che sta succedendo qui è che std :: cin > > firstName; legge solo ma non include il primo carattere di spazio bianco, che include la nuova riga (o '\ n' ) quando premi Invio, quindi quando arriva a getline (std :: cin, articleTitle); , '\ n' è ancora il carattere successivo in std :: cin , e getline () ritorna immediatamente.

// 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"

Aggiunta di ' std :: cin > > std :: ws '( ws che significa w hite s pace) prima che le tue chiamate a getline () risolvano il problema:

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

Ma è più facile vedere dove ti sei perso se lo fai nell'argomento:

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

Altri suggerimenti

Quando usi l'operatore > > , cin viene letto fino al successivo carattere di spazio bianco, ma non elabora lo spazio bianco. Quindi quando hai

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

la seconda chiamata elaborerà il carattere di nuova riga e non avrai la possibilità di digitare alcun input.

Invece, se hai intenzione di usare getline dopo un operatore > > , puoi chiamare std :: cin.ignore () per mangiare la newline prima di chiamare getline .

Modifica: funziona come previsto

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

poiché la seconda chiamata ignorerà tutti gli spazi bianchi principali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top