Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 文字処理ライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(18/36) - 文字処理ライブラリ(2/3)

14.25 英数字チェック関数

14.25.1 isalnum関数、isalpha関数、isdigit関数、isxdigit関数

これらの関数は文字(1文字)が英字または数字かどうかをチェックします。

  • isalnum関数は英字('A'〜'Z'、'a'〜'z')または数字('0'〜'9')かどうかをチェックします。
  • isalpha関数は英字('A'〜'Z'、'a'〜'z')かどうかをチェックします。
  • isdigit関数は数字('0'〜'9')かどうかをチェックします。
  • isxdigit関数は十六進数('0'〜'9'、'A'〜'F'または'a'〜'f')の数字かどうかをチェックします。
【表14-3-2】 isalnum関数、isalpha関数、isdigit関数、isxdigit関数
形式#include <ctype.h>
int isalnum(int c);
int isalpha(int c);
int isdigit(int c);
int isxdigit(int c);
返り値文字の種類が合っていた場合は0以外を返し、そうでない場合は0を返します。
引数
int c
チェックしたい文字を指定します。

14.25.2 例題

入力した商品コードと単価の形式をチェックします。それぞれの形式は次の通りです。

  • 商品コードは長さが6文字で、先頭1文字は英字、2文字目以降は英数字です。
  • 単価は1〜6文字で、全文字数字です。
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #define SIZE    16
  5.  
  6. /* 関数プロトタイプ宣言 */
  7. int ItemCheck(char *Item);
  8. int PriceCheck(char *Price);
  9.  
  10. int main(void)
  11. {
  12.     char    item[SIZE];
  13.     char    price[SIZE];
  14.  
  15.     printf("商品コードを入力してください ==> ");
  16.     scanf("%s", item);
  17.     if(ItemCheck(item))                /* 商品コードチェック */
  18.     {
  19.         printf("単価を入力してください ==> ");
  20.         scanf("%s", price);
  21.         if(PriceCheck(price))          /* 単価チェック */
  22.         {
  23.             printf("商品コード:%s\n", item);
  24.             printf("単価:%s\n", price);
  25.         }
  26.         else
  27.         {
  28.             printf("単価が不当です。\n");
  29.         }
  30.     }
  31.     else
  32.     {
  33.         printf("商品コードが不当です。\n");
  34.     }
  35.  
  36.     return 0;
  37. }
  38.  
  39. /* 商品コードのチェック */
  40. int ItemCheck(char *pItem)
  41. {
  42.     int     idx;
  43.  
  44.     /* 長さは6文字 */
  45.     if(strlen(pItem) != 6)
  46.     {
  47.         return 0;
  48.     }
  49.  
  50.     /* 先頭1文字は英字 */
  51.     if(! isalpha(*pItem))
  52.     {
  53.         return 0;
  54.     }
  55.  
  56.     /* 2文字目以降は英数字 */
  57.     for(idx = 1; idx < 6; ++idx)
  58.     {
  59.         if(! isalnum(*(pItem + idx)))
  60.         {
  61.             return 0;
  62.         }
  63.     }
  64.  
  65.     return 1;
  66. }
  67.  
  68. /* 単価のチェック */
  69. int PriceCheck(char *pPrice)
  70. {
  71.     int     length;
  72.     int     idx;
  73.  
  74.     length = strlen(pPrice);
  75.     /* 長さは6文字以下 */
  76.     if(length <= 0 || length > 6)
  77.     {
  78.         return 0;
  79.     }
  80.  
  81.     /* 全文字数字 */
  82.     for(idx = 0; idx < length; ++idx)
  83.     {
  84.         if(! isdigit(*(pPrice + idx)))
  85.         {
  86.             return 0;
  87.         }
  88.     }
  89.  
  90.     return 1;
  91. }
$ ./ex14_3_1.prg
商品コードを入力してください ==> T00001
単価を入力してください ==> 100
商品コード:T00001
単価:100
$
$ ./ex14_3_1.prg
商品コードを入力してください ==> 123456
商品コードが不当です。
$
$ ./ex14_3_1.prg
商品コードを入力してください ==> k123456
商品コードが不当です。
$
$ ./ex14_3_1.prg
商品コードを入力してください ==> k23-56
商品コードが不当です。
$
$ ./ex14_3_1.prg
商品コードを入力してください ==> t00002
単価を入力してください ==> 10-
単価が不当です。
$
$ ./ex14_3_1.prg
商品コードを入力してください ==> T00003
単価を入力してください ==> 1234567
単価が不当です。
$
3行目
文字処理関数を使いますので、ctype.hヘッダファイルを取り込みます。
51行目
商品コードの先頭1文字が英字かどうかをisalpha関数でチェックします。
59行目
商品コードの2文字目から6文字目が英数字かどうかをisalnum関数でチェックします。
84行目
単価が数字かどうかをisdigit関数でチェックします。

14.26 表示可能チェック関数

14.26.1 isgraph関数、isprint関数、ispunct関数

これらの関数は表示可能な文字かどうかをチェックします。

  • isgraph関数はスペース以外の表示可能な文字かどうかをチェックします。
  • isprint関数はスペースを含む表示可能な文字かどうかをチェックします。
  • ispunct関数はスペースと英数字以外の表示可能な文字かどうかをチェックします。
【表14-3-3】 isgraph関数、isprint関数、ispunct関数
形式#include <ctype.h>
int isgraph(int c);
int isprint(int c);
int ispunct(int c);
返り値文字の種類が合っていた場合は0以外を返し、そうでない場合は0を返します。
引数
int c
チェックしたい文字を指定します。

14.26.2 例題

入力した文字列中の表示しない文字を_(アンダライン)に置き替え表示します。

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #define SIZE    100
  4.  
  5. int main(void)
  6. {
  7.     char    str[SIZE];
  8.     int     idx;
  9.  
  10.     printf("文字列を入力してください ==> ");
  11.     fgets(str, SIZE, stdin);
  12.  
  13.     for(idx = 0; str[idx] != '\n'; ++idx)
  14.     {
  15.         if(! isgraph(str[idx]))
  16.         {
  17.             /* 表示しない文字を_に置き替える */
  18.             str[idx] = '_';
  19.         }
  20.     }
  21.  
  22.     printf("文字列:%s", str);
  23.  
  24.     return 0;
  25. }
$ ./ex14_3_2.prg
文字列を入力してください ==> Hello. Bye. ← 半角スペースを含みます
文字列:Hello._Bye.
$
$ ./ex14_3_2.prg
文字列を入力してください ==> Hello.     Bye. ← タブを含みます
文字列:Hello._Bye.
$
15行目
スペース以外の表示可能な文字であることをisgraph関数でチェックします。