Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน iswprint() ใน C++

บทความนี้สาธิตการทำงานของฟังก์ชัน iswprint() ใน C++ STL ฟังก์ชันนี้ใช้ตรวจสอบว่าตัวอักขระกว้าง (wide character) สามารถพิมพ์/แสดงผลได้หรือไม่ ฟังก์ชันอยู่ในเฮดเดอร์ <cwctype>

ตัวอักขระกว้าง (Wide character) เป็นชนิดข้อมูลตัวอักขระที่มีขนาดใหญ่กว่าตัวอักขระ 8-bit แบบดั้งเดิม (เช่น wchar_t มักเป็น 16 หรือ 32 bit) ใช้สำหรับรองรับ Unicode และชุดอักขระขนาดใหญ่

ไวยากรณ์ (Syntax)

int iswprint(wint_t c);

พารามิเตอร์

c – ตัวอักขระกว้างที่ต้องการตรวจสอบว่าเป็น printable หรือไม่

ค่าที่ส่งคืน

  • ค่าที่ไม่ใช่ศูนย์ (non-zero) – หาก c เป็นตัวอักขระที่พิมพ์ได้
  • ศูนย์ (0) – หาก c ไม่ใช่ตัวอักขระที่พิมพ์ได้ (control characters เป็นต้น)

ตัวอักขระที่พิมพ์ได้ (Printable Characters)

  • ตัวอักษรใหญ่ – A ถึง Z
  • ตัวอักษรเล็ก – a ถึง z
  • ตัวเลข – 0 ถึง 9
  • เครื่องหมายวรรคตอน – ! " @ # $ % ^ & * ( ) } | \ ] [ _ - + ' ? / . , } : ; ~ `
  • ช่องว่าง (Space)

ตัวอย่างโค้ดที่ 1: แทนที่อักขระที่พิมพ์ไม่ได้

#include <cwchar>
#include <iostream>
#include <cwctype>
using namespace std;

int main() {
    wchar_t str[] = L"authorized

ผลลัพธ์

authorized
คำอธิบาย: ตัวอักขระ < ไม่ได้อยู่ในรายการ printable characters ตาม locale เริ่มต้น จึงถูกแทนที่ด้วย @

ตัวอย่างโค้ดที่ 2

#include <cwchar>
#include <iostream>
#include <cwctype>
using namespace std;

int main() {
    wchar_t str[] = L"and I am<= Iron Man";
    wcout << str << endl;
    
    for (int i = 0; i < wcslen(str); i++) {
        if (!iswprint(str[i]))
            str[i] = L'&';
    }
    wcout << str << endl;
    return 0;
}

ผลลัพธ์

and I am<= Iron Man
and I am &&Iron Man

ข้อสังเกตเพิ่มเติม

  • พฤติกรรมของ iswprint() ขึ้นอยู่กับ locale ปัจจุบัน (ตั้งค่าด้วย setlocale())
  • ใน locale "C" เริ่มต้น มีเพียงอักขระ ASCII พิมพ์ได้เท่านั้นที่ถือว่า printable
  • สำหรับ Unicode จริงๆ ควรใช้ไลบรารี ICU หรือฟังก์ชันใน C++20 เช่น std::isprint กับ char8_t/char32_t
  • ฟังก์ชันที่เกี่ยวข้อง: iswspace(), iswalnum(), iswalpha(), iswdigit(), iswpunct()