พื้นฐาน C/C++

อ่านและตรวจสอบ input

การอ่าน input อาจล้มเหลวจึงต้องตรวจผลลัพธ์เสมอ

อ่านและตรวจสอบ input คืออะไร?

การอ่าน input อาจล้มเหลวจึงต้องตรวจผลลัพธ์เสมอ

อ่านข้อมูลผู้ใช้และปฏิเสธค่าที่ไม่ถูกต้อง

ประเด็นสำคัญ

  • เปิด compiler warning และแก้ทุกคำเตือน
  • รู้ type และ lifetime ของทุกค่า
  • ตรวจ input และขอบเขต array ให้ชัดเจน

ตัวอย่างโค้ด C และ C++

C
รันโค้ด →
main.c
#include <stdio.h>

int main(void) {
    int age;
    printf("Age: ");
    if (scanf("%d", &age) != 1 || age < 0) {
        puts("Invalid age");
        return 1;
    }
    printf("Next year: %d\n", age + 1);
    return 0;
}
ผลลัพธ์ที่คาดหวัง
Age: 20
Next year: 21
C++
รันโค้ด →
main.cpp
#include <iostream>

int main() {
    int age;
    std::cout << "Age: ";
    if (!(std::cin >> age) || age < 0) {
        std::cerr << "Invalid age\n";
        return 1;
    }
    std::cout << "Next year: " << age + 1 << '\n';
}
ผลลัพธ์ที่คาดหวัง
Age: 20
Next year: 21

เปรียบเทียบ C และ C++

scanf คืนจำนวน field ที่แปลงสำเร็จ ส่วน std::cin เข้า fail state เมื่ออ่าน type ที่ต้องการไม่ได้

C

C แสดง API แบบ procedural และรายละเอียด representation อย่างชัดเจน

C++

C++ รักษา low-level model และเพิ่ม type ที่ปลอดภัยกว่า

แบบฝึกหัด

รันทั้งสองเวอร์ชันแล้วแก้ไขเพื่อสังเกตความแตกต่างของภาษา

  • เพิ่ม input ผิดและค่าขอบเขต
  • Compile ด้วย -Wall -Wextra -Wpedantic
  • แยก declaration และ implementation