Problem when using 'getline' with 'cin' in C++

ว่าด้วยปัญหาที่ถูกตั้งคำถาม Classic เวลาเราใช้ cin ใน C++ กันเลยนะ
นั่นคือการใช้ cin รับ input ที่เป็น string with whitespaces เช่น "this is a cat"
ซึ่งจะเห็นได้ว่า เราจะได้แค่ "this" เก็บไว้ในตัวแปรเท่านั้น

ถ้าต้องการรจะรับ Input ที่เป็น String with whitespaces ให้เปลี่ยนมาใช้
cin.getline(char_array_variable, stream_size) กรณีที่ตัวแปรเป็น Array of Character
หรือ getline(cin, string_variable) ในกรณีที่ตัวแปรเป็น C++ String (#include <string>)

http://www.cplusplus.com/reference/istream/istream/getline/

แต่ปัญหาที่ผมจะกล่าวถึงมาจากการที่เราไม่สามารถใช้
cin.getline กับตัวแปรชนิดอื่นๆ ได้นอกจาก string (or array of character)

เราก็เลยต้องกลับไปใช้ cin นั่นแหละ ปัญหาที่เกิดขึ้นคือ ถ้าเราเรียกใช้ cin.getline ต่อจาก cin
มันจะข้ามการ input ของ cin.getline ไปเลย ดังภาพครับ


สาเหตุของปัญหาคือ ... คำสั่ง cin จะมี Newline Character (\n) ตอนที่เรากด Enter ติดท้ายมาเสมอ ... ทำให้เจ้า getline ที่ตามหลังมานั้นคิดว่า Newline Character เป็น stream ที่ถูก input เข้ามามันเลยถูกเรียกให้ทำงานทันที จึงทำให้ข้ามการ input จริงๆ ไป ...

วิธีการแก้ที่ง่ายที่สุดคือ ... หลอกมันครับ เอาตัวแปร Dummy มาให้มันเก็บ Newline Character ไปก่อน


Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22