1. ภาพรวมฟังก์ชัน scanf
ในการเรียนรู้ภาษาโปรแกรม C วิธีที่ใช้บ่อยที่สุดสำหรับการรับข้อมูลเข้าสู่โปรแกรมคือฟังก์ชัน scanf มันทำหน้าที่เหมือน “ผู้ฟัง” ของโปรแกรมที่เก็บข้อมูลที่ผู้ใช้ป้อนลงในตัวแปรที่กำหนด
ไวยากรณ์พื้นฐานของ scanf
scanf("formatSpecifier", &variable);
ที่นี่ส่วนสำคัญคือ “formatSpecifier” และเครื่องหมายแอมแปร์ (&) ที่อยู่หน้าตัวแปร ตัวระบุรูปแบบกำหนดประเภทของข้อมูลที่ต้องการรับ และ & บ่งบอกที่อยู่ของตัวแปรนั้น โดยปฏิบัติตามกฎนี้ scanf จะสามารถประมวลผลข้อมูลจากผู้ใช้ได้อย่างถูกต้อง
int num;
scanf("%d", &num);
ด้วยวิธีนี้ scanf จะให้ข้อมูลเข้ากับโปรแกรมและทำให้ข้อมูลนั้นสามารถใช้งานได้
2. ตัวระบุรูปแบบที่ใช้บ่อย
%d: สำหรับจำนวนเต็ม%f: สำหรับตัวเลขแบบจุดลอยfloat%lf: สำหรับตัวเลขแบบจุดลอยแบบ doubledouble%s: สำหรับสตริง (จบด้วยช่องว่าง)%c: สำหรับอักขระเดี่ยว
double val;
scanf("%lf", &val);
3. การประมวลผลหลายอินพุตพร้อมกัน
int age;
float height;
scanf("%d %f", &age, &height);
printf("Age: %d, Height: %.2fn", age, height);
4. การตรวจสอบความถูกต้องของอินพุตและการจัดการข้อผิดพลาด
int age;
printf("Please enter your age (0–120): ");
if (scanf("%d", &age) == 1 && age >= 0 && age <= 120) {
printf("The entered age is %d years.n", age);
} else {
printf("Invalid age.n");
}
5. การล้างสตรีมอินพุต
เมื่อใช้ scanf คุณอาจรู้สึกว่า “ข้อมูลก่อนหน้ายังคงอยู่” สิ่งนี้เกิดจากอักขระขึ้นบรรทัดใหม่ (\n) เป็นต้นที่ยังคงอยู่ในสตรีมอินพุต
scanf("%*[^n]");
scanf("%*c");
สิ่งนี้ทำให้คุณข้ามอักขระขึ้นบรรทัดใหม่หรืออักขระอื่น ๆ ที่เหลืออยู่ในบัฟเฟอร์อินพุตได้ อย่างไรก็ตาม ในระหว่างการประมวลผลลูปคุณควรหลีกเลี่ยงการใช้ fflush(stdin) ที่ไม่เป็นมาตรฐาน และใช้วิธีการเช่นข้างต้นเพื่อความปลอดภัย
6. ข้อผิดพลาดทั่วไปและแนวทางปฏิบัติที่ดีที่สุด
- การจับคู่ตัวระบุรูปแบบ: ให้ประเภทข้อมูลสอดคล้องกับตัวระบุ
- ระมัดระวังความยาวสตริง: เมื่อรับข้อมูลด้วย
%sให้คำนึงถึงขนาดบัฟเฟอร์ - การล้างสตรีม: อย่าให้เหลืออักขระขึ้นบรรทัดใหม่อยู่หลังการรับข้อมูล
7. การใช้งานขั้นสูง | เทคนิค scanf ที่ซับซ้อน
char name[20];
printf("Please enter your name: ");
scanf("%19s", name); // buffer-safe measure
printf("Hello, %s!n", name);
สรุป
ฟังก์ชัน scanf เป็นวิธีรับข้อมูลพื้นฐานในภาษา C เมื่อคุณเข้าใจตัวระบุรูปแบบ การตรวจสอบข้อผิดพลาด และการจัดการสตรีมอินพุตแล้ว คุณจะสามารถใช้ได้อย่างปลอดภัย ควรให้ความสนใจเป็นพิเศษต่อบัฟเฟอร์อินพุตที่เหลืออยู่และปัญหาโอเวอร์ฟลว์ของบัฟเฟอร์



