0Pricing
C++ Academy · บทเรียน

การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline

ใช้ std::getline รับข้อมูลทีละบรรทัด และตรวจสอบข้อมูลจากผู้ใช้ก่อนนำไปใช้งาน

การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดข้อมูลขาเข้าที่ปลอดภัยจึงสำคัญ

ข้อมูลขาเข้าของผู้ใช้เป็นแหล่งที่มาของการหยุดทำงานที่พบบ่อยที่สุด ชนิดข้อมูลที่ไม่ถูกต้อง บรรทัดว่าง หรืออักขระที่ไม่คาดคิด ล้วนทำให้โปรแกรมที่เขียนอย่างไม่รัดกุมทำงานผิดพลาดได้ การอ่านข้อมูลแบบป้องกันจึงเป็นสิ่งจำเป็น

พื้นฐาน std::getline

std::getline(stream, line) อ่านอักขระจนกว่าจะพบอักขระบรรทัดใหม่ถัดไป โดยจะอ่านบรรทัดใหม่นั้นออกจากสตรีม แต่ไม่เก็บไว้ในผลลัพธ์

std::string line;
std::getline(std::cin, line);

ตัวคั่นแบบกำหนดเอง

ส่งอาร์กิวเมนต์ตัวที่สามเพื่อให้หยุดที่อักขระใด ๆ ไม่ใช่เฉพาะบรรทัดใหม่

std::string field;
std::getline(std::cin, field, ',');

ตรวจสอบข้อมูลตัวเลขขาเข้า

อ่านทั้งบรรทัดก่อน แล้วจึงแยกวิเคราะห์ วิธีนี้ช่วยหลีกเลี่ยงสถานะล้มเหลวของ cin เมื่อข้อมูลขาเข้าไม่ถูกต้อง

std::string line;
int n;
if (std::getline(std::cin, line)) {
    try {
        n = std::stoi(line);
    } catch (...) {
        std::cout << "Invalid number\n";
    }
}

วนซ้ำจนกว่าจะถูกต้อง

ใช้ getline ร่วมกับ try/catch เพื่อขอให้ผู้ใช้ป้อนข้อมูลซ้ำจนกว่าจะได้รับข้อมูลที่ถูกต้อง

int age;
while (true) {
    std::cout << "Age: ";
    std::string line;
    std::getline(std::cin, line);
    try {
        age = std::stoi(line);
        if (age >= 0 && age < 150) break;
    } catch (...) {}
    std::cout << "Try again.\n";
}

ตรวจจับ EOF ใน getline

getline จะตั้งสถานะล้มเหลวให้สตรีมเมื่อพบ EOF ให้ตรวจสอบสตรีมหลังเรียกใช้คำสั่ง

std::string line;
while (std::getline(std::cin, line)) {
    process(line);
}

ตัดช่องว่าง

ผู้ใช้มักใส่ช่องว่างเกินมาโดยไม่ตั้งใจ ให้ตัดช่องว่างทั้งสองด้านหลังอ่านข้อมูล

void trim(std::string& s) {
    size_t start = s.find_first_not_of(" \t\r\n");
    size_t end   = s.find_last_not_of(" \t\r\n");
    s = (start == std::string::npos) ? "" : s.substr(start, end - start + 1);
}

ล้างสตรีม

หากใช้ >> ร่วมกับ getline ให้ล้างอักขระที่ค้างอยู่ก่อน

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

อ่านค่าหลายค่าต่อบรรทัด

อ่านทั้งบรรทัดก่อน จากนั้นส่งข้อมูลเข้า stringstream แล้วดึงค่าออกมา

std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
int a, b, c;
iss >> a >> b >> c;

ป้องกันความยาวสูงสุด

ปฏิเสธข้อมูลขาเข้าที่มีความยาวเกินกำหนดตั้งแต่เนิ่น ๆ เพื่อป้องกันการใช้ทรัพยากรมากเกินไปโดยไม่ตั้งใจ

std::string line;
if (std::getline(std::cin, line) && line.size() > 1024) {
    std::cout << "Input too long.\n";
    return 1;
}

อ่านรหัสผ่านหรือข้อมูลที่ซ่อนอยู่

ไลบรารีมาตรฐานไม่สามารถซ่อนข้อมูลขาเข้าที่แสดงบนหน้าจอได้ ให้ใช้ API ของแพลตฟอร์ม เช่น termios บน Unix หรือ SetConsoleMode บน Windows สำหรับการรับรหัสผ่าน

ตรวจสอบอย่างรวดเร็ว

เหตุใดการอ่านด้วย getline แล้วจึงแยกวิเคราะห์จึงปลอดภัยกว่าการใช้ std::cin >> n

ทบทวน

อ่านข้อมูลขาเข้าของผู้ใช้ด้วย std::getline ตรวจสอบหรือแยกวิเคราะห์แยกกัน และตัดช่องว่างออก ครอบการแยกวิเคราะห์ด้วย try/catch และวนซ้ำจนกว่าจะได้ค่าที่ถูกต้อง เมื่อต้องใช้การดึงค่าร่วมกับการอ่านทีละบรรทัด ให้ล้างสตรีมก่อน

คำถามที่พบบ่อย

บทเรียน “การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline”

ใช้ std::getline รับข้อมูลทีละบรรทัด และตรวจสอบข้อมูลจากผู้ใช้ก่อนนำไปใช้งาน คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การใช้ std::cin และ std::cout อย่างถูกต้อง
  2. การจัดรูปแบบผลลัพธ์ด้วย iomanip
  3. การอ่านข้อมูลเข้าอย่างปลอดภัยด้วย getline
  4. การทำงานกับ std::cerr และ std::clog
← กลับไปที่ C++ Academy