ما هي قواعد الكائن الأمراض المنقولة جنسيا :: CIN في C ++؟

StackOverflow https://stackoverflow.com/questions/805403

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أكتب برنامج صغير للاستعمال الشخصي لممارسة التعلم C ++ وظائفه، وهو MLA الاقتباس مولد (أنا أكتب ورقة كبيرة مع عشرات من الاستشهادات).

لعدم وجود طريقة أفضل للقيام بذلك (أنا لا أفهم الطبقات أو استخدام ملفات .CPP أخرى داخل الرئيسي الخاص بك، لذلك لا تهتم تقول لي، سوف أعمل على ذلك عندما يكون لدي المزيد من الوقت)، وأنا أكتب وظيفة لكل نوع من أنواع الاقتباس. أنا قد كسر هذه القاعده في وظيفة لكل رمز إعادة استخدامها إذا كنت تحصل على المزيد من الوقت.

وسؤالي هو: كيف الأمراض المنقولة جنسيا :: العمل الكائن CIN؟ أنا أقرأ حاليا في مع الأمراض المنقولة جنسيا :: CIN >> لسلاسل أتوقع أن تكون كلمة واحدة، وgetline (الأمراض المنقولة جنسيا :: CIN، سلسلة) لسلاسل بمسافات. أنا لا تحصل على إخراج الصحيح، وإن كان. أنا فقط أريد أن أعرف كيف الأمراض المنقولة جنسيا :: أعمال 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; يقرأ فقط ما يصل الى <م> ولكن ليس بما في ذلك أول حرف مسافة بيضاء، والذي يتضمن السطر (أو '\n') عند الضغط على دخول، لذلك عندما يحصل على 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 يعني whitespace) قبل مكالماتك إلى 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);

والدعوة الثانية سوف نقوم بمعالجة مجرد حرف السطر، وسوف لا يكون لديك فرصة لكتابة أي مساهمة.

وبدلا من ذلك، إذا كنت تخطط لاستخدام getline بعد operator >>، يمكنك الاتصال std::cin.ignore() أكل السطر الجديد قبل الاتصال getline.

وتحرير: أنه يعمل كما هو متوقع عند القيام

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

ومنذ الدعوة الثانية سيتم تجاهل كل المسافات الرائدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top