isblank

 isblankは,C99規格で新しく導入されました.ctype.hヘッダで宣言されています.今までにもisspaceがありましたが,isblankは純粋に空白をチェックします.

 isspaceは復帰コード,改行コードも空白と認識してしまいます.

 isblankは,\t(水平タブ)も空白と認識します.\v(垂直タブ)は空白と認識しません.

 リスト25に,isblankのテストを行うコードを,そして実行結果を以下に示します.

〔リスト25〕isblankの簡単な試験test125.c)
/*
 *isblank
 */
#include <stdio.h>
main()
{
 char buf[10];
 memset(&buf,' ',sizeof(buf));
 if (isblank(buf[0]) != 0 ) printf("' '=Blank\n");
 if (isblank(buf[0]) != 0 ) printf("' '=space\n");
 buf[1] = (char)"a";
 if (isblank(buf[1]) != 0 ) printf("a=Blank\n");
 if (isblank(buf[1]) != 0 ) printf("a=space\n");
 buf[2] = '\n';
 if (isblank(buf[2]) != 0 ) printf("\\n=Blank\n");
 if (isspace(buf[2]) != 0 ) printf("\\n=space\n");
 buf[3] = '\r';
 if (isblank(buf[3]) != 0 ) printf("\\r=Blank\n");
 if (isspace(buf[3]) != 0 ) printf("\\r=space\n");
 buf[4] = '\t';
 if (isblank(buf[4]) != 0 ) printf("\\t=Blank\n");
 if (isspace(buf[4]) != 0 ) printf("\\t=space\n");
 buf[5] = '\v';
 if (isblank(buf[5]) != 0 ) printf("\\v=Blank\n");
 if (isspace(buf[5]) != 0 ) printf("\\v=space\n");
 buf[6] = '\a';
 if (isblank(buf[6]) != 0 ) printf("\\a=Blank\n");
 if (isspace(buf[6]) != 0 ) printf("\\a=space\n");
 buf[7] = '\b';
 if (isblank(buf[7]) != 0 ) printf("\\b=Blank\n");
 if (isspace(buf[7]) != 0 ) printf("\\b=space\n");
 buf[8] = '\f';
 if (isblank(buf[8]) != 0 ) printf("\\f=Blank\n");
 if (isspace(buf[8]) != 0 ) printf("\\f=space\n");
}


  $ gcc test125.c -o test125
  $ ./test125
  ' '=Blank
  ' '=space
  \n=space
  \r=space
  \t=Blank
  \t=space
  \v=space
  \f=space
  $

 結果をまとめると,表1のようになります.用途によって使い分けることができます.もちろん,GNU Cでも使うことができます.

〔リスト25〕isblankの簡単な試験test125.c)
isspace isblank
空白(0x20)
\n復帰改行
\r復帰
\f改ページ
\t水平タブ
\v垂直タブ
\aベル
\b後退

 これ以降の関数やマクロに関しては,誌面の都合で検証および詳細な説明は次回に行います.ここでは簡単な説明にとどめておきます.

関数やマクロの概略

マクロDECIMAL_DIG

 float.hで宣言されているはずですが,GNU C2.95では存在しません.C99規格で新しく導入されました.

 浮動小数点型で表現できる最大の10進桁数が定義されているはずです.

マクロFLT_EVAL_METHOD

 float.hで宣言されているはずですが,GNU C2.95では存在しません.C99規格で新しく導入されました.

 浮動小数点演算を行うときの範囲と精度を示す値が定義されているはずです.

math.hの新しいマクロや関数

 C99規格で拡張または追加されたmath.h関連のマクロや関数についてGNU C2.95では,まだ未対応です.

 公式ページの情報によるとライブラリに問題があるようです.

マクロva_copy

 va_copyはC99規格で新たに導入されたマクロで,stdarg.hヘッダで定義されています.GNU C2.95でも対応しています.可変長引き数リストのコピーを行うために使用します.

 他の環境ではそのまま“va_copy”かもしれませんが,GNU Cでは,_va_copyとして定義されています.

 以下の一連の流れをマクロ化したものです.

1)va_startで可変長引き数への参照のためのオブジェクトを初期化
2)va_argで型を指定して可変長引き数を取り出す
3)va_endを使用してオブジェクトを破棄

 つまり,va_startでメモリを割り当て,パラメータを格納し,次のパラメータがどれかを指し示すようにします.そしてva_argでリストを順番にたどり,va_endで割り当てたメモリを開放します.

stdio.hに追加されたいくつかの関数

・snprintf

 これは,sprintfに出力文字数を指定できるようにしたものです.宣言は次のとおりです.

  int snprintf(char *str, size_t size, const char *format, ...);

・vsnprintf

 実際はstdarg.hに追加されたものですが,ここで説明します.

 snprintfの可変数引き数の代わりにva_listを用いて呼び出しを行うものです.これらのva_listを使う関数では,va_endマクロは呼び出されません.メモリの解放は使う側の責任です.

 宣言は以下のとおりです.

  int vsnprintf(char *str, size_t size, const char *format, va_list arg);

・vscanf,vsscanf,vfscanf

 va_listを引き数に持つscanf関連の関数です.

  int vscanf(const char *format, va_list arg);
  int vsscanf(const char *str, const char *format, va_list arg);
  int vfscanf(FILE *stream, const char *format, va_list arg);

stdlibに追加されたいくつかの関数

・_Exit

 signalや終了関数を呼び出さずに,プログラムを終了コードstatusですぐに終了させます._exit関数と等価です.

  void _Exit(int status);

・strtof,strtold関数

 strtofはfloatに,strtoldはlong doubleに対応しています.

 float型(strtof),またはlong double型(strtold)を文字列に変換します.

  float strtof(const char *nptr, char **endptr);
  long double strtold(const char *nptr, char **endptr);

・strtoll,strtoull関数

 見てわかるようにlong long int型を文字列に変換する関数です.

  strtoll(const char *nptr, char **endptr, int base);
  strtoull(const char *nptr, char **endptr, int base);

・atoll,llabs,lldiv関数

 long long int型関係です.

 atollは文字列をlong long int型の値として変換します.

  long long atoll(const char *nptr);

 llabsはlong long int型整数の絶対値を計算します.

  long long int llabs(long long int j);

 lldivはlong int型の割算の商と余りを計算するものです.

  ldiv_t lldiv(long long int numer, long long int denom);

wchar.hに追加されたいくつかの関数

・vwscanf,vswscanf,vfwscanf

 va_listを引き数にもつscanf関係の関数です.

 vsscanfなどがワイド文字列に対応しているものです.

  int vwscanf(const wchar_t * format, va_list arg);
  int vswscanf(const wchar_t * s, const wchar_t * format, va_list arg);
  int vfwscanf(FILE *fp, const wchar_t *format, va_list arg);

・wcstof,wcstold

 ワイド文字列対応で浮動小数点文字列をfloatやlong doubleに変換するものです.

  float wcstof(const wchar_t *restrict p, wchar_t ** endp);
  long double wcstold(const wchar_t *restrict p, wchar_t ** endp);

・wcstoll,wcstoull

 ワイド文字列対応で文字列をlong long int,unsigned long long intに変換するものです.

  long long int wcstoll(const wchar_t * p, wchar_t ** endp, int base);
  unsigned long long int wcstoull (const wchar_t * p, wchar_t ** endp, int base);

wctype.hに追加された関数

・iswblank

 isblankのワイド文字列対応版です.結果は表1と同じになるはずです.

*          *

 C99関連の話題はつきませんが,ここで一区切りとします.次回は,次の項目に対して説明と検証を行います.

・追加された関数・マクロについて
・新規に追加された標準ライブラリについて
・C99規格対応に関するGNU Cのバージョンごとの進捗 

Copyright 2003 岸 哲夫

Copyright 1997-2017 CQ Publishing Co.,Ltd.

 

NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
C99規格の予約語について/新しく定義されたマクロとプラグマ/C99規格のマクロ/その他のプリプロセッサ関連
定数の指定方法/配列について/bool型について/long long int型/整数除算に関する規定/複素数型
暗黙の関数宣言と変数宣言/定義済みマクロ__func__と可変長引き数マクロ/列挙型について/inline関数定義/restrictポインタ/変数宣言の位置/配列の初期化について/コンパウンドリテラル(Compound Literal)
◆isblank/関数やマクロの概略