Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - その他のライブラリ」です。
assert関数はプログラムのデバッグを支援するためのものです。具体的には引数の値が偽(0)の場合、標準エラー出力にメッセージを出力した後、abort関数を呼び出してプロセスを異常終了します。なお、ヘッダファイルassert.hのインクルード前に、NDEBUGマクロが定義されていた場合はassert関数は何の動作も行いません。
assert関数はマクロとして定義されていますが、ここでは関数と記述します。
形式 | #include <assert.h> void assert(scalar expression); |
---|---|
返り値 | ありません。 |
引数 |
|
実行時引数で指定したファイルの内容を標準出力に出力します。ただし、指定したファイルのオープンに失敗した場合はassert関数により異常終了します。
$ ls /etc/issue aaa.txt ls: cannot access aaa.txt: そのようなファイルやディレクトリはありません /etc/issue $ $ ./ex14_8_1.prg /etc/issue Fedora release 10 (Cambridge) Kernel \r on an \m (\l) $ $ ./ex14_8_1.prg aaa.txt ex14_8_1.prg: ex14_8_1.c:14: main: Assertion `fp == ((void *)0) ? 0 : 1' failed. アボートしました $
ロケール(locale)はメッセージ出力に使用する言語や文字集合および、表記に関する慣習といったような言語や文化ルールの集合です。プログラムをいろいろな国や文化に対応可能とするには、ロケールに応じて適切な動作ができるように作成しなければなりません。
localeconv関数は現在のロケールの数値に関する書式情報を格納してあるlconv構造体へのポインタを取得します。lconv構造体はロケール・カテゴリのLC_NUMERIC(数値情報)と、LC_MONETARY(通貨情報)に関連する値を保持しています。
形式 | #include <locale.h> struct lconv *localeconv(void); |
---|---|
返り値 | lconv構造体へのポインタを返します。 |
引数 | ありません。 |
lconv構造体の内容は次の通りです。この構造体はヘッダファイルのlocale.hに宣言されています。なお、下表の最初から3つは通貨以外の数値情報で、4つ目以降は通貨情報です。
メンバー名 | 型名 | 内容 |
---|---|---|
decimal_point | char * | 小数点を表す文字です。 |
thousands_sep | char * | 整数部の区切り文字です。 |
grouping | char * | 区切り文字で区切る整数部の桁数です。 |
int_curr_symbol | char * | 最初の三つの文字はISO 4217の通貨記号、四番目の文字は区切り文字、五番目は半角スペースです。 |
currency_symbol | char * | 通貨記号です。 |
mon_decimal_point | char * | 小数点を表す文字です。 |
mon_thousands_sep | char * | thousands_sepと同じです。 |
mon_grouping | char * | groupingと同じです。 |
positive_sign | char * | 正の値を表す符号です。 |
negative_sign | char * | 負の値を表す符号です。 |
int_frac_digits | char | 国際的な小数部の数字です。 |
frac_digits | char | ローカルな小数部の数字です。 |
p_cs_precedes | char | 正の値の前に通貨記号を置く場合は1、後ろに置く場合は0です。 |
p_sep_by_space | char | 正の値と通貨記号の間にスペースを入れる場合は1です。 |
n_cs_precedes | char | 負の値の前に通貨記号を置く場合は1、後ろに置く場合は0です。 |
n_sep_by_space | char | 負の値と通貨記号の間にスペースを入れる場合は1です。 |
p_sign_posn | char | 正の値に対して、値と通貨記号を括弧で囲む場合は0、符号を値と通貨記号の前に置く場合は1、符号を値と通貨記号の後に置く場合は2、符号を通貨記号の直後に置く場合は3、符号を通貨記号の直前に置く場合は4です。 |
n_sign_posn | char | 負の値に対して、値と通貨記号を括弧で囲む場合は0、符号を値と通貨記号の前に置く場合は1、符号を値と通貨記号の後に置く場合は2、符号を通貨記号の直後に置く場合は3、符号を通貨記号の直前に置く場合は4です。 |
setlocale関数はロケールの設定と取得を行います。
形式 | #include <locale.h> char *setlocale(int category, const char *locale); |
---|---|
返り値 | 設定したロケールに対応する内部文字列を返します。エラーの場合はNULLを返します。 |
引数 |
|
第1引数のcategoryには下表の値を指定できます。
カテゴリ名 | 内容 |
---|---|
LC_ALL | 全てのカテゴリです。 |
LC_COLLATE | 正規表現のマッチング(範囲表現と等価クラスのマッチングを決定する)と文字列の照合です。 |
LC_CTYPE | 正規表現のマッチング、文字の分類、文字の変換、大文字小文字比較、ワイド文字関数です。 |
LC_MESSAGES | 地域化可能な自然言語メッセージです。 |
LC_MONETARY | 通貨の書式です。 |
LC_NUMERIC | 数値の書式(小数点や3桁ごとの区切り等)です。 |
LC_TIME | 時刻と日付けの書式です。 |
入力した値をロケールに従い通貨表現形式に編集して標準出力に出力します。なお、ここで使用しているstrfmon関数はANSI Cの標準ライブラリではないため、詳細な説明は省略します。
$ ./ex14_8_2.prg ロケール : ja_JP.UTF-8 ← 設定したロケールです 数値を入力してください(0で終了)==> 123 ¥123 数値を入力してください(0で終了)==> 1234 ¥1,234 数値を入力してください(0で終了)==> 1234567890 ¥1,234,567,890 数値を入力してください(0で終了)==> -1234567890 ¥-1,234,567,890 数値を入力してください(0で終了)==> 0 $ $ export LANG='da_DK' ← LANG環境変数の値をda_DKに変更します $ echo $LANG da_DK $ ./ex14_8_2.prg ロケール : da_DK ← 設定したロケールです 数値を入力してください(0で終了)==> 123 kr 123,00 数値を入力してください(0で終了)==> 1234 kr 1.234,00 数値を入力してください(0で終了)==> 1234567890 kr 1.234.567.890,00 数値を入力してください(0で終了)==> -1234567890 kr -1.234.567.890,00 数値を入力してください(0で終了)==> 0 $