C ++中std :: cin对象的规则是什么?

我正在编写一个小程序供我个人使用,以练习学习C ++及其功能,MLA引文生成器(我正在写一篇带有数十篇引文的大型论文)。

由于缺乏更好的方法来做到这一点(我不了解类或在你的主内部使用其他.cpp文件,所以不要打扰告诉我,当我有更多时间我会努力),我写每种引文的功能。 如果我获得更多时间,我可能会将其分解为每个重用代码的函数。

我的问题是:std :: cin对象是如何工作的? 我目前正在用std :: cin >>读取字符串,我希望这些字符串是单个字符,而getline(std :: cin,字符串)则是空格字符串。 虽然我没有得到正确的输出结果。 我只想知道std :: cin是如何工作的,以及为什么我意外地跳过一些输入(例如,它跳过webPage而不是给我一个输入的机会)。

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
}

编辑: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. 

正如你所看到的,有些事情出错了,因为我的输入被越过了。


这里发生的是std::cin >> firstName; 只读取但不包括第一个空格字符,其中包括换行符(或'n' ),当你按下回车键,所以当它到达getline(std::cin, articleTitle);'n'仍然是std::cin的下一个字符,并且getline()立即返回。

// cin = "BloggsnJoenMan of Steel, Woman of Kleenexn"
std::cin >> lastName;
std::cin >> firstName;
// firstName = "Joe", lastName = "Bloggs", cin = "nMan of Steel, Woman of Kleenexn"
getline(std::cin, articleTitle);
// articleTitle = "", cin = "Man of Steel, Woman of Kleenexn"

添加' std::cin >> std::ws '( ws意思w海特s你调用函数getline()前的速度)解决了这个问题:

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

但是如果你在论证中这样做了,那么更容易看到你错过了它的位置:

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

当您使用>>运算符时, cin会读取直到下一个空白字符,但它不处理空白字符。 所以,当你有

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

第二个调用将仅处理换行符,并且您将无法输入任何输入。

相反,如果您打算在operator >>之后使用getline ,则可以在调用getline之前调用std::cin.ignore()来使用换行符。

编辑:它可以按照您的预期工作

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

因为第二次调用将忽略所有主要的空白。

链接地址: http://www.djcxy.com/p/31531.html

上一篇: What are the rules of the std::cin object in C++?

下一篇: C++ ifstream::read slow due to memcpy