文字型

[C++] char配列をint配列に変換する方法

C++でchar配列をint配列に変換するには、各文字を数値に変換してint型の配列に格納します。

具体的には、文字が数字である場合、ASCIIコードを利用して変換します。

例えば、’0’のASCII値は48なので、\(‘c’ – ‘0’\)で数値に変換できます。

文字列が”123″の場合、対応するint配列は\([1, 2, 3]\)となります。

char配列をint配列に変換する基本的な方法

C++において、char配列をint配列に変換する基本的な方法は、各文字をそのASCII値に基づいて整数に変換することです。

以下にその方法を示します。

#include <iostream>
int main() {
    // char配列の定義
    char charArray[] = "12345"; // 変換したい文字列
    int intArray[sizeof(charArray)]; // int配列のサイズをchar配列に合わせる
    // char配列をint配列に変換
    for (size_t i = 0; i < sizeof(charArray) - 1; ++i) { // -1はヌル終端を除外
        intArray[i] = charArray[i] - '0'; // ASCII値から'0'を引くことで整数に変換
    }
    // 結果の表示
    for (size_t i = 0; i < sizeof(intArray) - 1; ++i) {
        std::cout << intArray[i] << " "; // int配列の要素を表示
    }
    std::cout << std::endl; // 改行
    return 0;
}
1 2 3 4 5

このコードでは、char配列に格納された文字列 12345 をint配列に変換しています。

各文字はそのASCII値から’0’のASCII値を引くことで、対応する整数に変換されます。

最終的に、int配列の内容がコンソールに表示されます。

応用的な変換方法

char配列をint配列に変換する基本的な方法に加えて、より応用的な変換方法も存在します。

ここでは、文字列を整数に変換する際に、エラーチェックや異なる基数(例えば、16進数)での変換を行う方法を紹介します。

1. エラーチェックを含む変換

以下のコードでは、char配列をint配列に変換する際に、各文字が数字であるかどうかを確認し、エラー処理を行います。

#include <iostream>
#include <cctype> // isdigit関数を使用するために必要
int main() {
    char charArray[] = "123a45"; // 変換したい文字列(エラーを含む)
    int intArray[sizeof(charArray)];
    bool hasError = false; // エラーフラグ
    for (size_t i = 0; i < sizeof(charArray) - 1; ++i) {
        if (isdigit(charArray[i])) { // 数字かどうかをチェック
            intArray[i] = charArray[i] - '0'; // 整数に変換
        } else {
            hasError = true; // エラーが発生した場合
            std::cout << "エラー: '" << charArray[i] << "' は数字ではありません。" << std::endl;
            break; // ループを終了
        }
    }
    if (!hasError) {
        for (size_t i = 0; i < sizeof(intArray) - 1; ++i) {
            std::cout << intArray[i] << " "; // int配列の要素を表示
        }
        std::cout << std::endl; // 改行
    }
    return 0;
}
エラー: 'a' は数字ではありません。

このコードでは、isdigit関数を使用して、各文字が数字であるかどうかを確認しています。

数字でない場合はエラーメッセージを表示し、処理を中断します。

2. 16進数からの変換

次に、16進数のchar配列をint配列に変換する方法を示します。

以下のコードでは、文字列 1A2B を整数に変換します。

#include <iostream>
#include <sstream> // std::stringstreamを使用するために必要

int main() {
    char charArray[] = "1A2B"; // 変換したい16進数の文字列
    int intArray[(sizeof(charArray) - 1) / 2]; // 16進数は2桁で1つの整数を表す
    std::stringstream ss; // 文字列ストリームを作成

    for (size_t i = 0; i < sizeof(charArray) - 1; i += 2) {
        std::string hexStr(charArray + i, 2); // 2文字ずつ取り出す
        int value;
        ss.clear();               // ストリームをクリア
        ss.str("");               // ストリームの内容をリセット
        ss << std::hex << hexStr; // 16進数としてストリームに追加
        ss >> value;              // 整数に変換
        intArray[i / 2] = value;  // int配列に格納
    }

    // 結果の表示
    for (size_t i = 0; i < sizeof(intArray) / sizeof(intArray[0]); ++i) {
        std::cout << intArray[i] << " "; // int配列の要素を表示
    }
    std::cout << std::endl; // 改行

    return 0;
}
26 43

このコードでは、std::stringstreamを使用して、16進数の文字列を整数に変換しています。

2文字ずつ取り出し、16進数として解釈してint配列に格納します。

エラー処理と例外対応

C++でchar配列をint配列に変換する際には、エラー処理や例外対応が重要です。

特に、無効な入力や変換に失敗した場合に適切に対処することが求められます。

以下に、エラー処理と例外対応の方法を示します。

1. 例外を使用したエラー処理

C++では、例外を使用してエラーを処理することができます。

以下のコードでは、無効な文字が含まれている場合に例外を投げる方法を示します。

#include <iostream>
#include <stdexcept> // std::invalid_argumentを使用するために必要
void convertCharArrayToIntArray(const char* charArray, int* intArray, size_t size) {
    for (size_t i = 0; i < size; ++i) {
        if (!isdigit(charArray[i])) { // 数字かどうかをチェック
            throw std::invalid_argument("無効な文字が含まれています。"); // 例外を投げる
        }
        intArray[i] = charArray[i] - '0'; // 整数に変換
    }
}
int main() {
    char charArray[] = "123a45"; // 変換したい文字列(エラーを含む)
    int intArray[sizeof(charArray)];
    try {
        convertCharArrayToIntArray(charArray, intArray, sizeof(charArray) - 1); // 変換を試みる
    } catch (const std::invalid_argument& e) { // 例外をキャッチ
        std::cerr << "エラー: " << e.what() << std::endl; // エラーメッセージを表示
        return 1; // エラーコードを返す
    }
    // 結果の表示
    for (size_t i = 0; i < sizeof(intArray) - 1; ++i) {
        std::cout << intArray[i] << " "; // int配列の要素を表示
    }
    std::cout << std::endl; // 改行
    return 0;
}
エラー: 無効な文字が含まれています。

このコードでは、convertCharArrayToIntArray関数内で無効な文字が見つかった場合にstd::invalid_argument例外を投げています。

main関数では、try-catchブロックを使用して例外をキャッチし、エラーメッセージを表示します。

2. 戻り値を使用したエラー処理

例外を使用せずに、戻り値を使ってエラー処理を行う方法もあります。

以下のコードでは、変換が成功したかどうかを示す戻り値を使用しています。

#include <iostream>
#include <cctype> // isdigitを使用するために必要

bool convertCharArrayToIntArray(const char* charArray, int* intArray, size_t size) {
    for (size_t i = 0; i < size; ++i) {
        if (!isdigit(static_cast<unsigned char>(charArray[i]))) { // 数字かどうかをチェック
            return false;             // エラーが発生した場合
        }
        intArray[i] = charArray[i] - '0'; // 整数に変換
    }
    return true; // 成功
}

int main() {
    char charArray[] = "12345"; // 変換したい文字列
    int intArray[sizeof(charArray) - 1]; // ヌル文字を除いたサイズ

    if (!convertCharArrayToIntArray(charArray, intArray, sizeof(charArray) - 1)) {
        std::cerr << "エラー: 無効な文字が含まれています。" << std::endl; // エラーメッセージを表示
        return 1;               // エラーコードを返す
    }

    // 結果の表示
    for (size_t i = 0; i < sizeof(charArray) - 1; ++i) {
        std::cout << intArray[i] << " "; // int配列の要素を表示
    }
    std::cout << std::endl; // 改行

    return 0;
}
1 2 3 4 5

このコードでは、convertCharArrayToIntArray関数が成功したかどうかをbool型の戻り値で示しています。

エラーが発生した場合は、falseを返し、main関数でエラーメッセージを表示します。

成功した場合は、int配列の内容が表示されます。

まとめ

この記事では、C++におけるchar配列をint配列に変換する方法について、基本的な手法から応用的な技術、さらにエラー処理や例外対応の重要性までを詳しく解説しました。

特に、無効な入力に対するエラーチェックや、例外を用いたエラー処理の方法は、実際のプログラミングにおいて非常に役立つスキルです。

これらの知識を活用して、より堅牢で信頼性の高いプログラムを作成することを目指してみてください。

関連記事

Back to top button