문제

나는 C ++ 학습을 연습하기위한 개인적인 사용과 그 기능을 위해 MLA 인용 생성기 (수십 개의 인용이있는 큰 논문을 쓰고 있음)에 대한 작은 프로그램을 작성하고 있습니다.

더 나은 방법이 없기 때문에 (수업을 이해하지 못하거나 메인 안에 다른 .CPP 파일을 사용하지 않으므로, 더 많은 시간이있을 때 그 일을 할 것입니다), 나는 글을 쓰고 있습니다. 각 유형의 인용에 대한 기능. 더 많은 시간이 걸리면 재사용 된 코드에 대한 기능으로 이것을 분류 할 수 있습니다.

내 질문은 : STD :: CIN 객체는 어떻게 작동합니까? 나는 현재 std :: cin >>과 함께 읽고 있습니다. 문자열은 단일 단어가 될 것으로 예상하고 공백이있는 문자열에 대한 getline (std :: cin, string)을 기대하고 있습니다. 그래도 올바른 출력을 얻지 못합니다. STD :: CIN이 어떻게 작동하는지, 왜 일부 입력을 예기치 않게 건너 뛰는 지 알고 싶습니다 (예 : 입력 할 수있는 기회를 제공하는 대신 웹 페이지를 건너 뜁니다).

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; 만 읽습니다 그러나 포함하지 않습니다 Newline (또는 '\n') Enter를 누르면 getline(std::cin, articleTitle);, '\n' 여전히 다음 캐릭터입니다 std::cin, 그리고 getline() 즉시 돌아옵니다.

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

추가 'std::cin >> std::ws' (ws 의미 w하이이트sPace) 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);

두 번째 호출은 Newline 캐릭터를 처리하며 입력을 입력 할 기회가 없습니다.

대신, 당신이 사용할 계획이라면 getlineoperator >>, 전화해도됩니다 std::cin.ignore() 전화하기 전에 Newline을 먹습니다 getline.

편집 : 당신이 할 때 예상대로 작동합니다.

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

두 번째 호출은 모든 주요 공백을 무시할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top