Posts

Showing posts with the label standard input

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

Image
ว่าด้วยปัญหาที่ถูกตั้งคำถาม 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 ...

Standard Input/Output Redirection

Image
ผมเขียนโปรแกรมตัวนึง เป็นโจทย์ของการแข่งขัน ACM - ICPC Programming Contest แน่นอนว่า โจทย์ปัญหาพวกนี้ต้องการหลาย Test Case ในการทดสอบความถูกต้องของโปรแกรม ครั้นผมจะนั่งใส่ Standard Input เองก็เหนื่อยอยู่ :) ดังนั้นเรามา "หัดสบาย" กันเถอะ นี่คือ Test Case ของโจทย์ข้อนี้ครับ ... สังเกตุบรรทัดแรกจะเห็นจำนวนของ Test Case และต่อๆ มาก็จะเป็นเนื้อหาของ Test Case นั้นๆ ... ผมจึงต้องเขียนโปรแกรมให้มันรันตามจำนวน "บรรทัดแรก" ของไฟล์ที่รับเข้าไป (ในที่นี้คือ t ในไฟล์ earthquake.cpp) ดังนั้นขึ้นอยู่กับว่า คุณมีกี่ Test Case ก็มาเปลี่ยนด้วยนะ (จริงๆ มันมีวิธีเขียน Script แล้วแยกไฟล์ Test Case ด้วยนะ แต่ทำไม่เป็นน่ะ นี่คือวิธีที่ในการแข่งขันใช้ :) คราวนี้การใส่ Standard Input ก็ง่ายแสนง่ายครับ เพียงแค่ ในขั้นตอนการรัน Execute File ไฟล์ (ในที่นี้คือ a.out) ให้ใส่เครื่องหมาย < filename  แล้วตามด้วยชื่อไฟล์ที่ต้องการ :) แล้วเรายังสามารถเขียน Output ลงไฟล์ได้ด้วยนะ ส่วนวิธีการ Output มี 2 แบบคือ Overwrite และ Append ถ้าเขียนทับไฟล์เก่าเลย (Overwrite) ให้ใช้ ...