1. getchar คืออะไร?
ฟังก์ชัน getchar
เป็นหนึ่งในฟังก์ชันพื้นฐานสำหรับการรับข้อมูลเข้าในภาษา C โดยจะอ่านอักขระหนึ่งตัวจากมาตรฐานอินพุต (คีย์บอร์ด) หลังจากที่ผู้ใช้พิมพ์อักขระและกด Enter ฟังก์ชันนี้จะส่งคืนรหัส ASCII ของอักขระนั้น จึงเหมาะสำหรับการประมวลผลข้อมูลเข้าอย่างง่าย เช่น การรับอักขระทีละตัวจากผู้ใช้
คุณสมบัติของ getchar
- รับอักขระหนึ่งตัวจากมาตรฐานอินพุต: โปรแกรมจะรอจนกว่าผู้ใช้จะกด Enter ก่อนเริ่มประมวลผล
- ส่งคืนรหัส ASCII: อักขระที่รับมาจะถูกส่งคืนเป็นรหัส ASCII ถ้าต้องการแสดงเป็นอักขระ ต้องแปลง (cast) เป็น char ก่อน
getchar
เหมาะสำหรับการประมวลผลข้อมูลเข้าแบบง่ายหรือโปรแกรมโต้ตอบ และเป็นฟังก์ชันที่นิยมใช้สำหรับผู้เริ่มต้นเรียนภาษา C เนื่องจากใช้งานง่าย
ตัวอย่างการใช้งาน
ตัวอย่างต่อไปนี้แสดงการใช้งาน getchar
แบบง่าย
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกอักขระ: ");
c = getchar();
printf("อักขระที่กรอก: %c\n", c);
return 0;
}
ในโปรแกรมนี้ ผู้ใช้จะกรอกอักขระ 1 ตัวจากคีย์บอร์ด และจะแสดงอักขระที่รับมา เช่น ถ้ากรอก “A” จะได้ผลลัพธ์ดังนี้
กรุณากรอกอักขระ: A
อักขระที่กรอก: A
2. วิธีใช้ getchar เบื้องต้น
วิธีเรียกใช้งานพื้นฐาน
สามารถเรียกใช้งานฟังก์ชัน getchar
ได้ตามตัวอย่างนี้
int getchar(void);
ฟังก์ชันนี้ไม่มีอาร์กิวเมนต์ รับอักขระหนึ่งตัวแล้วส่งคืนรหัส ASCII โดยชนิดข้อมูลที่ส่งคืนคือ int
หากเกิดข้อผิดพลาดจะส่งคืน EOF
(End Of File)
ตัวอย่างการรับอักขระอย่างง่าย
จากตัวอย่างข้างต้น จะใช้ getchar
รับอักขระหนึ่งตัวแล้วแสดงผล เหมาะกับกรณีที่ต้องการประมวลผลทีละตัว
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกอักขระ: ");
c = getchar();
printf("อักขระที่กรอก: %c\n", c);
return 0;
}
โค้ดนี้จะรับอักขระจาก getchar
และแสดงผลด้วย printf
3. ตัวอย่างการใช้ getchar ขั้นสูง
EOF (End Of File) กับ getchar
ฟังก์ชัน getchar
ไม่เพียงแต่อ่านอักขระ แต่ยังสามารถตรวจจับการสิ้นสุดของอินพุต (EOF) ได้ เช่น การกด “Ctrl+Z” (Windows) หรือ “Ctrl+D” (Unix) จะส่ง EOF
ตัวอย่างต่อไปนี้จะแสดงการอ่านอักขระต่อเนื่องจนกว่าจะพบ EOF
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกอักขระ (จบด้วย EOF): ");
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
โค้ดนี้ใช้ getchar
และ putchar
เพื่อแสดงอักขระที่รับเข้ามาทั้งหมดจนกว่าจะพบ EOF
การรับอักขระหลายตัว
สามารถใช้ getchar
รับอักขระหลายตัว เช่น ตัวอย่างด้านล่างจะแสดงอักขระทีละตัวจนกว่าจะกด Enter (ขึ้นบรรทัดใหม่)
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกข้อความ: ");
while ((c = getchar()) != '\n') {
printf("อักขระที่กรอก: %c\n", c);
}
return 0;
}
โปรแกรมนี้จะวนลูปอ่านอักขระและแสดงผลทีละตัวจนกว่าจะพบ ‘\n’

4. EOF กับการจัดการบัฟเฟอร์
บทบาทของ EOF
EOF (End Of File) หมายถึงการสิ้นสุดของไฟล์หรืออินพุตมาตรฐาน เมื่อ getchar
พบ EOF จะส่งคืนค่า -1 โปรแกรมสามารถตรวจสอบและจบการทำงานได้ สำหรับคีย์บอร์ดต้องใช้คีย์พิเศษเพื่อส่ง EOF
การบัฟเฟอร์และ getchar
เนื่องจาก getchar
จะเก็บข้อมูลไว้ในบัฟเฟอร์ จึงอาจมีอักขระค้างอยู่ในบัฟเฟอร์เมื่อรับอินพุตหลายครั้ง หากต้องการข้าม ‘\n’ ให้เพิ่มโค้ดดังนี้
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกอักขระ: ");
c = getchar();
while (getchar() != '\n'); // ข้ามอักขระขึ้นบรรทัดใหม่ในบัฟเฟอร์
printf("อักขระที่กรอก: %c\n", c);
return 0;
}
โค้ดนี้ช่วยให้แสดงอักขระที่กรอกโดยไม่มี ‘\n’ ค้างในบัฟเฟอร์
5. การเปรียบเทียบ getchar กับฟังก์ชันรับอินพุตอื่นๆ
ความแตกต่างระหว่าง getchar และ scanf
getchar
และ scanf
ใช้สำหรับรับข้อมูลเข้า แต่ scanf
รองรับหลายชนิดข้อมูล เช่น ตัวเลข อักขระ หรือสตริง และใช้ฟอร์แมตสเปคิฟายเออร์ ขณะที่ getchar
จะรับเพียงอักขระเดียว
ตัวอย่างการรับอินพุตด้วย scanf:
#include <stdio.h>
int main() {
int num;
printf("กรุณากรอกตัวเลข: ");
scanf("%d", &num);
printf("ตัวเลขที่กรอก: %d\n", num);
return 0;
}
โค้ดนี้ใช้ scanf
รับตัวเลขและแสดงผล สามารถรับข้อมูลหลากหลายประเภทและหลายค่าในคราวเดียว
ความแตกต่างระหว่าง getchar และ fgets
fgets
ต่างจาก getchar
ตรงที่สามารถอ่านสตริง (อักขระหลายตัว) ได้ในครั้งเดียว เหมาะกับกรณีรับข้อความยาว และสามารถกำหนดขนาดบัฟเฟอร์เพื่อป้องกัน buffer overflow ได้
ตัวอย่างการรับอินพุตด้วย fgets:
#include <stdio.h>
int main() {
char str[100];
printf("กรุณากรอกข้อความ: ");
fgets(str, sizeof(str), stdin);
printf("ข้อความที่กรอก: %s", str);
return 0;
}
โค้ดนี้ใช้ fgets
รับข้อความรวมถึง ‘\n’ เหมาะกับการอ่านข้อมูลแบบหลายบรรทัด
การเลือกใช้ getchar, scanf, fgets
- getchar เหมาะกับกรณีรับอินพุตทีละตัว เช่น เลือกเมนูหรือรับ key input
- scanf ใช้รับข้อมูลหลายชนิด (ตัวเลข/ข้อความ) แต่ต้องระวังเรื่อง error checking
- fgets ดีสำหรับการรับข้อความยาวหรือหลายบรรทัด และป้องกัน buffer overflow
6. ตัวอย่างจริง: โต้ตอบกับผู้ใช้ด้วย getchar
getchar
นิยมใช้ในโปรแกรมโต้ตอบ เช่น เมนูหรือเกมง่ายๆ ต่อไปนี้คือตัวอย่างการใช้รับอักขระเพื่อควบคุมเมนู
โค้ดตัวอย่าง: เลือกเมนูด้วยอักขระ
#include <stdio.h>
int main() {
char choice;
printf("เลือกเมนู (a: สวัสดี, b: จบโปรแกรม): ");
choice = getchar();
switch (choice) {
case 'a':
printf("สวัสดี!\n");
break;
case 'b':
printf("จบการทำงานของโปรแกรม\n");
break;
default:
printf("เลือกไม่ถูกต้อง\n");
}
return 0;
}
โปรแกรมนี้จะแสดงข้อความตามอักขระที่กรอก (‘a’ หรือ ‘b’) สามารถสร้างเมนูง่ายๆ ได้ด้วย getchar
โปรแกรมขั้นสูง: รับคำสั่งหลายแบบ
ตัวอย่างต่อไปจะแสดงวิธีรับอักขระเพื่อสั่งงานต่างๆ
#include <stdio.h>
int main() {
char command;
printf("กรุณากรอกคำสั่ง (l: แสดงรายการ, h: ทักทาย, q: จบ): ");
command = getchar();
switch (command) {
case 'l':
printf("แสดงรายการ\n");
break;
case 'h':
printf("สวัสดี!\n");
break;
case 'q':
printf("จบการทำงานของโปรแกรม\n");
break;
default:
printf("คำสั่งไม่ถูกต้อง\n");
}
return 0;
}
โปรแกรมนี้จะประมวลผลตามคำสั่ง (l, h, q) ที่ผู้ใช้กรอก
7. ข้อควรระวังและแนวปฏิบัติสำหรับ getchar
ปัญหาทั่วไป: การจัดการบัฟเฟอร์
ข้อควรระวังในการใช้ getchar
คือ อักขระในบัฟเฟอร์อาจมีผลกับการรับข้อมูลในครั้งถัดไป เช่น อักขระขึ้นบรรทัดใหม่ (‘\n’) จะถูกเก็บไว้และอาจถูกอ่านในรอบถัดไป จึงควรเคลียร์บัฟเฟอร์ทุกครั้งหลังรับข้อมูล
วิธีข้ามอักขระขึ้นบรรทัดใหม่:
#include <stdio.h>
int main() {
int c;
printf("กรุณากรอกอักขระ: ");
c = getchar();
while (getchar() != '\n'); // ข้าม '\n'
printf("อักขระที่กรอก: %c\n", c);
return 0;
}
ในตัวอย่างนี้จะข้าม ‘\n’ ที่ค้างในบัฟเฟอร์หลังการกรอกอักขระ
แนวปฏิบัติที่ดีที่สุด
- เคลียร์บัฟเฟอร์: ทุกครั้งหลังรับข้อมูล ควรล้างอักขระที่ค้างในบัฟเฟอร์
- จัดการข้อผิดพลาด: ตรวจสอบค่าที่ได้จาก
getchar
ว่าเป็นEOF
หรือไม่ โดยเฉพาะเมื่อรับอินพุตจากไฟล์ - จำกัดการรับอินพุต: หากต้องรับข้อความยาวหรืออินพุตที่ซับซ้อน ควรใช้
fgets
เพราะสามารถจำกัดขนาดข้อมูลได้
8. สรุปและขั้นตอนถัดไป
บทความนี้ได้อธิบายวิธีใช้ getchar
ตั้งแต่พื้นฐานจนถึงการเปรียบเทียบกับฟังก์ชันรับข้อมูลอื่นๆ ในภาษา C getchar
เป็นเครื่องมือที่ใช้งานง่ายและเหมาะกับโปรแกรมโต้ตอบหรือรับอักขระอย่างง่าย
ขั้นตอนต่อไปที่ควรศึกษา
- ศึกษา fgets และ scanf เพิ่มเติม: หากต้องรับข้อความหรือค่าหลายประเภท ควรศึกษา
fgets
และscanf
ให้ลึกขึ้น - ใช้งานการรับข้อมูลจากไฟล์:
getchar
ไม่ได้จำกัดแค่รับข้อมูลจากคีย์บอร์ด ยังสามารถใช้กับไฟล์ได้ - ฝึกจัดการข้อผิดพลาด: การตรวจสอบ
EOF
หรือข้อมูลที่ไม่ถูกต้อง จะช่วยให้โปรแกรมมีความเสถียรยิ่งขึ้น
เมื่อเข้าใจพื้นฐานเหล่านี้แล้ว จะสามารถพัฒนาโปรแกรมภาษา C ที่ใช้งานได้จริงและมีประสิทธิภาพมากขึ้น