C++のiswprint()関数とは?ワイド文字が印刷可能か判定する方法
C++ STLに用意されているiswprint()関数は、指定されたワイド文字(wide character)が印刷可能かどうかを判定するための関数です。この関数はヘッダーファイル<cwctype>で定義されています。ワイド文字とは、従来の8ビット文字よりも大きなサイズを持つコンピュータ上の文字データ型のことで、主にマルチバイト文字やUnicode文字を扱う際に使用されます。
構文
int iswprint(c);
パラメータ
c ― 印刷可能かどうかを判定したいワイド文字を指定します。
戻り値
cが印刷可能な場合は0以外の値を返し、印刷できない場合は0を返します。
印刷可能とみなされる文字の一覧
- 大文字:A〜Z
- 小文字:a〜z
- 数字:0〜9
- 記号(句読点):! " @ # $ % ^ & * ( ) | \ ] [ _ - + ' ? / . , : ; ~ ` など
- 空白(スペース)
これら以外の制御文字などは印刷不可と判定されます。
使用例1
次のコードでは、文字列内に含まれる印刷不可能な文字を検出し、「@」に置き換えています。
#include <iostream>
#include <cwctype>
#include <cwchar>
using namespace std;
int main(){
wchar_t str[] = L"authorized\x01channel\x02partners";
wcout << str << endl;
for (int i = 0; i < wcslen(str); i++){
if (!iswprint(str[i]))
str[i] = L'@';
}
wcout << str;
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます。
authorizedchannelpartners authorized@channel@partners
1行目は元の文字列を出力したものですが、制御文字は画面に表示されないため、置き換え後の2行目で初めて印刷不可能な文字が「@」に変換されたことが確認できます。
使用例2
今度は、印刷不可能な文字を「&」に置き換える例です。
#include <iostream>
#include <cwctype>
#include <cwchar>
using namespace std;
int main(){
wchar_t str[] = L"and I am\x03 Iron Man";
wcout << str << endl;
for (int i = 0; i < wcslen(str); i++){
if (!iswprint(str[i]))
str[i] = L'&';
}
wcout << str;
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます。
and I am Iron Man and I am& Iron Man
まとめ
iswprint()関数を使えば、ワイド文字列の中に印刷できない文字(制御文字など)が混入していないかを簡単にチェックできます。ユーザー入力のサニタイズやログ出力前のデータ整形など、表示できない文字を別の記号に置き換えたい場面で非常に役立つ関数です。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の