nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

整数値をアスキーコードに変換する方法 (_itoa_s関数使用)

はじめに

例えば、124や0x2Fなどの整数値をアスキーコードに変換しようとする場合は、_itoa_sを使うと簡単に変換できます。
関数仕様については、MSDNのドキュメントをご確認ください。

errno_t _itoa_s(  
   int value,  
   char *buffer,  
   size_t sizeInCharacters,  
   int radix   
);  

環境

  • Visual Studio Community 2017
  • C++コンソールアプリケーション

コード

コードを以下に記載します。

#include "stdafx.h"
#include <stdlib.h>  
#include <string.h> 

int main()
{
        int i;
        char buffer[33] = { 0 };


        printf("Enter a number: ");
        scanf_s("%X", &i);

        // 入力した値を、基数(10)に従ってアスキーコードに変換
        _itoa_s(i, buffer, 10);
        printf("decimal: %s\n", buffer);
        printf("buffer length: %d\n", static_cast<int>(strlen(buffer)));

        // 入力した値を、基数(16)に従ってアスキーコードに変換
        _itoa_s(i, buffer, 16);
        printf("hexadecimal: %s\n", buffer);
        printf("buffer length: %d\n", static_cast<int>(strlen(buffer)));

        // 入力した値を、基数(2)に従ってアスキーコードに変換
        _itoa_s(i, buffer, 2);
        printf("binary: %s\n", buffer);
        printf("buffer length: %d\n", static_cast<int>(strlen(buffer)));


        // バッファクリアテスト
        printf("\r\n\r\n---- buffer zero clear ---- \r\n\r\n");
        memset(buffer, 0, sizeof(buffer));

        for (int i = 0; i < sizeof(buffer); i++)
        {
            printf("buffer[%d] = %d\r\n", i, buffer[i]);
        }

        // _itoa_s関数テスト
        printf("\r\n\r\n---- execute _itoa_s ---- \r\n\r\n");
        int targetNum = 0x2F;
        _itoa_s(targetNum, buffer, 16);
        printf("hexadecimal: %s\n", buffer);
        printf("buffer length: %d\n", strlen(buffer));

        for (int i = 0; i < sizeof(buffer); i++)
        {
            printf("buffer[%d] = %d\r\n", i , buffer[i]);
        }

        system("pause");
        return 0;
}

テスト結果

基数に従って、アスキーコードに変換されていることがわかります。

Enter a number: 100
decimal: 256
buffer length: 3
hexadecimal: 100
buffer length: 3
binary: 100000000
buffer length: 9


---- buffer zero clear ----

buffer[0] = 0
buffer[1] = 0
buffer[2] = 0
buffer[3] = 0
buffer[4] = 0
buffer[5] = 0
buffer[6] = 0
buffer[7] = 0
buffer[8] = 0
buffer[9] = 0
buffer[10] = 0
buffer[11] = 0
buffer[12] = 0
buffer[13] = 0
buffer[14] = 0
buffer[15] = 0
buffer[16] = 0
buffer[17] = 0
buffer[18] = 0
buffer[19] = 0
buffer[20] = 0
buffer[21] = 0
buffer[22] = 0
buffer[23] = 0
buffer[24] = 0
buffer[25] = 0
buffer[26] = 0
buffer[27] = 0
buffer[28] = 0
buffer[29] = 0
buffer[30] = 0
buffer[31] = 0
buffer[32] = 0


---- execute _itoa_s ----

hexadecimal: 2f
buffer length: 2
buffer[0] = 50
buffer[1] = 102
buffer[2] = 0
buffer[3] = -2
buffer[4] = -2
buffer[5] = -2
buffer[6] = -2
buffer[7] = -2
buffer[8] = -2
buffer[9] = -2
buffer[10] = -2
buffer[11] = -2
buffer[12] = -2
buffer[13] = -2
buffer[14] = -2
buffer[15] = -2
buffer[16] = -2
buffer[17] = -2
buffer[18] = -2
buffer[19] = -2
buffer[20] = -2
buffer[21] = -2
buffer[22] = -2
buffer[23] = -2
buffer[24] = -2
buffer[25] = -2
buffer[26] = -2
buffer[27] = -2
buffer[28] = -2
buffer[29] = -2
buffer[30] = -2
buffer[31] = -2
buffer[32] = -2
続行するには何かキーを押してください . . .

16進数の値をアスキーコードに変換して、動的配列(std::vector)に格納する。その後、std::vectorをchar配列に変換

#include "stdafx.h"
#include <iostream>
#include <vector>

int main()
{
        std::vector<char> v;

        // 16進数の値をアスキーコードに変換して、動的配列(std::vector<char>)に格納する
        for (int i = 0; i < 16; i++)
        {
            char buffer[3] = { 0 };

            _itoa_s(i, buffer, 16);

            for (int j = 0; j < strlen(buffer); j++)
            {
                v.push_back(buffer[j]);
            }

        }

        printf("\r\n\r\n---- result ---- \r\n\r\n");
        for (int x : v) {
            std::cout << x << std::endl;
        }

        printf("\r\n\r\n---- result(16進数表示) ---- \r\n\r\n");
        for (int x : v) {
            std::cout << "0x" << std::hex << x << std::endl;
        }

        // std::vector<char>をchar配列に変換
        printf("\r\n\r\n---- std::vector<char>をchar配列に変換 ---- \r\n\r\n");
        int nSize = v.size();

        char *strResult = new char[nSize];

        memcpy_s(strResult, nSize, v.data(), nSize);

        for (int i = 0; i < nSize; i++)
        {
            printf("%02X(code : %c)\r\n", *(strResult + i), *(strResult + i));
        }

        system("pause");

        delete[] strResult;

        return 0;
}
---- result ----

48
49
50
51
52
53
54
55
56
57
97
98
99
100
101
102


---- result(16進数表示) ----

0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
0x61
0x62
0x63
0x64
0x65
0x66


---- std::vector<char>からchar配列に変換 ----

30(code : 0)
31(code : 1)
32(code : 2)
33(code : 3)
34(code : 4)
35(code : 5)
36(code : 6)
37(code : 7)
38(code : 8)
39(code : 9)
61(code : a)
62(code : b)
63(code : c)
64(code : d)
65(code : e)
66(code : f)