【C言語】文字列を数値に変換するプログラム(10進、16進)

C言語 研修プログラム

ソフトウェア会社の研修時代に作成したプログラムです。
参考になればうれしいです。

今回の研修プログラムは文字列を数値に変換するという内容です。

C言語のような静的型付け言語の場合は、特定のデータ型に格納できる値(バイト数)があらかじめ決まっています。そのため、文字の’1’と数値の1は厳密に区別されます。

この文字列を数値に変換する機会は実務でも頻繁に発生します。その際は、C言語の標準ライブラリやその会社が独自に作成した関数を使用する場合もあります。

今回のプログラムでは以下のように変換できるように作成するのが研修内容でした。
10進の文字列変換:”2020”(char配列) → 2020(int型)
16進の文字列変換:”6B”(char型) → 107(int型)

なお、16進で変換できるのは整数値のみです。

スポンサーリンク

Sample Code

/*******************************************************************
文字列を数値に変換するプログラム(10進or16進)
※16進は整数値のみ変換可能

<lesson_016.c> ver1.00
--------------------------------------------------------------------
作成日:
作成者:

********************************************************************/
//---ヘッダーファイル---
#include <stdio.h>

/************************* マクロ定義 *******************************/
#define HEX_CH   6  //16進文字列の要素数

#define MODE_DEC 0  //10進数の文字列
#define MODE_HEX 1  //16進数の文字列
/************************** static関数 ******************************/

//-------------------------------------------------------------------
// 関数名 :ConvStrInt
// 機  能 :10進文字列をint型整数に変換
// 戻り値 :int
//-------------------------------------------------------------------
int ConvStrInt(      /* 戻り値:変換した整数値(default:0) */
  char* decStr       /* i:変換する文字列のアドレス */
)

{
  int i = 0;
  int j = 0;
  int count  = 0;                //入力された数字の数
  int keta   = 0;                //入力された数字のケタ数
  int shisu = 0;                 //指数
  int rDef = 0;                  //デフォルト値
  int minusFlag = 0;             //フラグ値(初期値:0)
  int bekijo;                    //指数でべき乗した桁の重み
  int outputNum = 0;             //変換後の数字

  char ch;                       //読み取った文字
  char numArray[256];            //読み込んだ文字列を順番に格納

  for(i = 0; ; i++)
  {
    ch = decStr[i];  //配列の先頭から文字を格納

    /* 数字の場合 */
    if('0'<= ch && ch <= '9')   //文字コードの範囲内なら
    {
      numArray[j] = (ch - '0'); //文字から文字'0'を引く
      j++;
      count++;
      keta++;
    }
    else if(ch == ' ')  //空白の場合
    {
      continue;  //読み飛ばし
    }
    else if(ch == '-')
    {
      minusFlag = 1;  //負の数のフラグを1にする
    }
    else  //該当しない文字の場合はループを抜ける
    {
      break;
    }
  }

  /* 数字が1文字も取得できなかった場合 */
  if(keta == 0)
  {
    printf("数字を認識できませんでした。\n");
    return rDef;
  }

  /* 桁の重みを(keta-1)乗して変換 */
  for(i = 0; i < count; i++)
  {
    if(keta == 1)  //1の位はそのまま加算
    {
      outputNum += numArray[i];
    }
    else
    {
      /* 指数計算 */
      shisu = keta - 1;
      bekijo = 1;

      while(shisu != 0)  //指数が0になるまで乗算する
      {
        bekijo = bekijo * 10;   //10で乗算する
        shisu--;  //指数の数を1減らす
      }
      outputNum += (numArray[i] * bekijo);  //1番上の桁から加算
    }
    keta--;
  }

  /* もし、負の数だったら */
  if(minusFlag == 1)
  {
    outputNum *= -1;  //マイナスに変換する
  }

  return outputNum;
}


//------------------------------------------------------------------
// 関数名 :ConvStrHex
// 機  能 :16進文字列をintの整数に変換(整数値のみ対応)
// 戻り値 :int
//------------------------------------------------------------------
int ConvStrHex(           /* 戻り値:変換した数値(default:0) */
  char * hexStr           /* i:変換対象の文字列 */
)

{
  int i = 0;
  int j = 0;
  int k = 0;
  int count  = 0;              //入力された数字の数
  int keta   = 0;              //入力された数字のケタ数
  int shisu = 0;               //指数
  int bekijo;                  //指数でべき乗した桁の重み
  int rDef = 0;                //デフォルト値
  int outputNum = 0;           //変換後の数字

  char ch;                     //読み取った文字

  int numArray[1024];          //読み込んだ文字列を順番に格納

  /* 16進の記号と対応する数字の配列 */
  const char hexCh[HEX_CH]  = {'A', 'B', 'C', 'D', 'E', 'F'};
  const int  hexNum[HEX_CH] = {10,  11,  12,  13,  14, 15};

  /* 16進数に変換 */
  for(i = 0; ; i++)
  {
    ch = hexStr[i];  //配列の先頭から文字を格納

    /* 数字の場合 */
    if('0'<= ch && ch <= '9')
    {
      numArray[j] = (ch - '0');
      j++;
      count++;
      keta++;
    }
    else if(ch == ' ')  //空白の場合
    {
      continue;  //読み飛ばし
    }
    else if(   ch == 'A'    //16進のアルファベットだったら
            || ch == 'B'
            || ch == 'C'
            || ch == 'D'
            || ch == 'E'
            || ch == 'F')
    {
      /* ループで検索して10~15の数字を格納 */
      for(k = 0; k < HEX_CH; k++)
      {
        if(ch == hexCh[k])
        {
          numArray[j] = hexNum[k];  //A~Fに対応する数値を格納
          j++;
          count++;
          keta++;
          break;
        }
      }
    }
    else  //該当しない文字の場合はループを抜ける
    {
      break;
    }
  }

  /* 数字が1文字も取得できなかった場合 */
  if(keta == 0)
  {
    printf("数字を認識できませんでした。\n");
    return rDef;
  }

  /* 桁の重みを(keta-1)乗して変換 */
  for(i = 0; i < count; i++)
  {
    if(keta == 1)  //1の位はそのまま加算
    {
      outputNum += numArray[i];
    }
    else
    {
      /* 指数計算 */
      shisu = keta - 1;
      bekijo = 1;

      while(shisu != 0) //指数が0になるまで乗算する
      {
        bekijo = bekijo * 16;  //16で乗算する
        shisu--;  //指数を1減らす
      }
      outputNum += (numArray[i] * bekijo);  //1番上の桁から加算
    }
    keta--;
  }
  return outputNum;
}


/*********************************************************************
---main関数---
**********************************************************************/
int main(void)
{
  int  mode = 0;      //10進:0 16進:1
  int  reVal = 0;     //変換された数値
  char strBuf[256];   //文字列を格納する配列


  /* 文字列の入力を受け付ける */
  printf("数値を入力して下さい。\n");
  scanf("%s", strBuf);

  /* 変換するモード(10進or16進)を選択する */
  printf("変換するモードを選択 10進:0 16進:1\n >>");
  scanf("%d", &mode);

  /* modeの値で呼ぶ関数を振り分ける */
  switch (mode)
  {
    case MODE_DEC:  //10進
      reVal = ConvStrInt(strBuf);
      printf("変換した数値:%d\n", reVal);
      break;
    case MODE_HEX:  //16進
      reVal = ConvStrHex(strBuf);
      printf("変換した数値:%d\n", reVal);
      break;
    default:
      printf("選択されたモードが正しくありません。\n");
  }

  return 0;
}

実行例

その他:研修で作成したC言語プログラム

その他のC言語プログラムはこの投稿にまとめてあります!

C言語の初心者用コードなので是非活用して下さい。
【C言語】研修 サンプルプログラム集

コメント

タイトルとURLをコピーしました