การใช้งานฟังก์ชัน getchar ในภาษา C: คู่มือฉบับสมบูรณ์สำหรับผู้เริ่มต้น

目次

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’ ที่ค้างในบัฟเฟอร์หลังการกรอกอักขระ

แนวปฏิบัติที่ดีที่สุด

  1. เคลียร์บัฟเฟอร์: ทุกครั้งหลังรับข้อมูล ควรล้างอักขระที่ค้างในบัฟเฟอร์
  2. จัดการข้อผิดพลาด: ตรวจสอบค่าที่ได้จาก getchar ว่าเป็น EOF หรือไม่ โดยเฉพาะเมื่อรับอินพุตจากไฟล์
  3. จำกัดการรับอินพุต: หากต้องรับข้อความยาวหรืออินพุตที่ซับซ้อน ควรใช้ fgets เพราะสามารถจำกัดขนาดข้อมูลได้

8. สรุปและขั้นตอนถัดไป

บทความนี้ได้อธิบายวิธีใช้ getchar ตั้งแต่พื้นฐานจนถึงการเปรียบเทียบกับฟังก์ชันรับข้อมูลอื่นๆ ในภาษา C getchar เป็นเครื่องมือที่ใช้งานง่ายและเหมาะกับโปรแกรมโต้ตอบหรือรับอักขระอย่างง่าย

ขั้นตอนต่อไปที่ควรศึกษา

  1. ศึกษา fgets และ scanf เพิ่มเติม: หากต้องรับข้อความหรือค่าหลายประเภท ควรศึกษา fgets และ scanf ให้ลึกขึ้น
  2. ใช้งานการรับข้อมูลจากไฟล์: getchar ไม่ได้จำกัดแค่รับข้อมูลจากคีย์บอร์ด ยังสามารถใช้กับไฟล์ได้
  3. ฝึกจัดการข้อผิดพลาด: การตรวจสอบ EOF หรือข้อมูลที่ไม่ถูกต้อง จะช่วยให้โปรแกรมมีความเสถียรยิ่งขึ้น

เมื่อเข้าใจพื้นฐานเหล่านี้แล้ว จะสามารถพัฒนาโปรแกรมภาษา C ที่ใช้งานได้จริงและมีประสิทธิภาพมากขึ้น

年収訴求