Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เหตุใด std::getline() ข้ามอินพุตหลังจากการแตกไฟล์ที่จัดรูปแบบแล้ว


std::getline() ข้ามอินพุตหลังจากการแยกรูปแบบบางส่วน เราสามารถตรวจสอบข้อผิดพลาดนี้ได้จากรหัสต่อไปนี้ −

โค้ดตัวอย่าง

#include <iostream>
#include <string>
using namespace std;

int main(){
   string name;
   string city;

   if (cin >> name && getline(cin, city)){
      cout << "Your name " << name << " and city " << city;
   }
}

ผลลัพธ์

Amal
Your name Amal and city

เราจะเห็นว่าโปรแกรมไม่รับอินพุตที่สอง บางครั้งอาจใช้อินพุตที่สอง แต่ในเอาต์พุตจะแสดงเฉพาะอินพุตแรกเท่านั้น ตอนนี้คำถามคือ ทำไมถึงมีพฤติกรรมเช่นนี้?

สาเหตุหลักของปัญหานี้ก็คือ เมื่อเราเขียนสตริงแรก เราจะกดปุ่ม Enter หรือ Return เมื่อกด Enter หรือ Return จะแทรกอักขระ '\n' หลังบรรทัดปัจจุบัน ตัวละครตัวนี้กำลังสร้างปัญหา กำลังข้ามส่วนถัดไปของสตริง

หากชื่อคือ "Amal" แสดงว่าภายในจะได้รับ "Amal\n" เพื่อแก้ปัญหานี้ ทางเลือกหนึ่งคือการเรียก std::cin.ignore() หลังจากการแตกไฟล์ครั้งแรก จากนั้นมันจะทิ้งอักขระตัวถัดไปออกไป ดังนั้นมันจึงทำงานได้ดี