อ่านและตรวจสอบ input
การอ่าน input อาจล้มเหลวจึงต้องตรวจผลลัพธ์เสมอ
อ่านและตรวจสอบ input คืออะไร?
การอ่าน input อาจล้มเหลวจึงต้องตรวจผลลัพธ์เสมอ
อ่านข้อมูลผู้ใช้และปฏิเสธค่าที่ไม่ถูกต้อง
ประเด็นสำคัญ
- เปิด compiler warning และแก้ทุกคำเตือน
- รู้ type และ lifetime ของทุกค่า
- ตรวจ input และขอบเขต array ให้ชัดเจน
ตัวอย่างโค้ด 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