Question

Je suis en train d’écrire un petit programme personnel destiné à la pratique de l’apprentissage du C ++ et, pour sa fonctionnalité, à un générateur de citations MLA (j’écris un grand article avec des dizaines de citations).

Faute de meilleur moyen de le faire (je ne comprends pas les cours ni l’utilisation d’autres fichiers .cpp dans votre fichier principal, ne vous inquiétez donc pas, je vais y travailler quand j’ai plus de temps), J'écris une fonction pour chaque type de citation. Je pourrais décomposer cela en une fonction pour chaque code réutilisé si je dispose de plus de temps.

Ma question est la suivante: comment fonctionne l'objet std :: cin? Je lis actuellement avec std :: cin > > Je m'attends à ce que les chaînes soient composées de mots simples et à getline (std :: cin, string) pour les chaînes comportant des espaces. Je ne reçois pas le bon résultat, cependant. Je veux juste savoir comment fonctionne std :: cin et pourquoi je continue de sauter de manière inattendue certaines entrées (par exemple, il saute une page Web au lieu de me laisser une chance de la saisir).

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: E / S

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. 

Comme vous pouvez le constater, quelque chose ne va pas car mon entrée est ignorée.

Était-ce utile?

La solution

Ce qui se passe ici, c'est que std :: cin > > firstName; ne lit que jusqu'à mais n'inclut pas le premier caractère d'espacement, qui inclut la nouvelle ligne (ou '\ n' ) lorsque vous appuyez sur entrée, alors il arrive à getline (std :: cin, articleTitle); , '\ n' est toujours le caractère suivant dans std :: cin , et getline () est renvoyé immédiatement.

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

Ajout de ' std :: cin > > std :: ws '( ws signifiant w rythme s ) avant que vos appels à getline () résolvent le problème:

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

Mais il est plus facile de voir où vous l'avez manqué si vous le faites dans l'argument:

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

Autres conseils

Lorsque vous utilisez l'opérateur > > , cin est lu jusqu'au prochain caractère d'espacement, mais ne traite pas cet espace. Alors, quand vous avez

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

le second appel traitera simplement le caractère de nouvelle ligne et vous n'aurez plus aucune chance de saisir une entrée.

Si vous prévoyez d'utiliser getline après un opérateur > > , vous pouvez appeler std :: cin.ignore () pour manger la nouvelle ligne avant d'appeler getline .

Modifier: cela fonctionne comme prévu lorsque vous le faites

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

puisque le deuxième appel ignorera tous les espaces en début de ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top