iscntrl関数は、指定された文字が制御文字(コントロール文字)かを調べます。制御字文字はASCII文字セットの場合、’0x00’~’0x1F’と’0x7F’の33文字です。

#include <ctype.h>
int iscntrl(int c);

cは、チェックしたい文字を指定します。int型ですので注意してください。

戻り値として、引数の値が制御文字であれば0以外を、そうでなければ0を返します。

プログラム 例

#include <stdio.h>
#include <ctype.h>

int main(void)
{
  FILE   *fp;
  char   in_file[100];       /* 入力ファイル */
  int    in_data;            /* 入力データ */
  int    ctrl_cnt = 0;       /* 制御文字の個数 */
  int    other_cnt = 0;      /* 制御文字以外の個数 */
  int    return_code = 0;    /* リターンコード */

  printf('入力ファイルのパス名を入力してください ==> ');
  scanf('%s', &in_file);

  if ((fp = fopen(in_file, 'r')) != NULL) {
    while ((in_data = getc(fp)) != EOF) {
      /* in_dataの値が制御文字だったら0以外が返る */
      if (iscntrl(in_data) != 0) {
        ++ctrl_cnt;          /* 制御文字数のカウントアップ */
      }
      else {
        ++other_cnt;         /* 制御文字以外の数のカウントアップ */
      }
    }
    fclose(fp);
    /* 結果の表示 */
    printf('制御文字  :%5d\n', ctrl_cnt);
    printf('制御文字以外:%5d\n', other_cnt);
    printf('合計    :%5d\n', ctrl_cnt + other_cnt);
 }
  else {
    return_code = 1;
  }

  return return_code;
}

例の実行結果

$ wc -lc iscntrl.c      # 行数とバイト数を表示
  37 1114 iscntrl.c
$ ./iscntrl.exe
入力ファイルのパス名を入力してください ==> iscntrl.c
制御文字  :   37
制御文字以外: 1077
合計    : 1114
$