C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でASCII値の数列を対応する文字列に変換する方法


はじめに

このチュートリアルでは、ASCII値が並んだ文字列を、それに対応する実際の文字列へと変換するC++プログラムについて解説します。

問題の概要

入力として、ASCIIコードが連なった数字の文字列が与えられます。課題は、この文字列を対応する文字に変換し、結果を出力することです。

たとえば「104101108108111」は、104が「h」、101が「e」、108が「l」、111が「o」に対応するため、「hello」と変換できます。

変換の考え方

ASCIIコードは2桁または3桁の数値で表されるため、単純に固定桁数で区切ることはできません。そこで、次のようなアルゴリズムを使用します。

  1. 文字列を先頭から1桁ずつ読み込み、「num × 10 + 現在の桁の値」の計算で数値を累積していく。
  2. 累積した数値が有効なASCIIの範囲(32〜122)に収まった時点で、その数値を文字に変換して出力し、numを0にリセットする。
  3. この処理を文字列の末尾まで繰り返す。

C++での実装例

#include <bits/stdc++.h>
using namespace std;
// ASCIIの数列を文字列に変換する関数
void convert_ASCII(string str, int len) {
    int num = 0;
    for (int i = 0; i < len; i++) {
        // 現在の桁を数値に追加
        num = num * 10 + (str[i] - '0');
        // 数値が有効な範囲内かどうかを確認
        if (num >= 32 && num <= 122) {
            char ch = (char)num;
            cout << ch;
            num = 0;
        }
    }
}
int main() {
    string str = "104101108108111443211911111410810033";
    int len = str.length();
    convert_ASCII(str, len);
    return 0;
}

出力結果

hello, world!

コードの解説

convert_ASCII関数では、文字列を先頭から走査し、各桁の数字を数値numに累積していきます。数値が32以上122以下(アルファベットや記号など、印字可能なASCII文字の範囲)に達した時点で、その値をchar型にキャストして出力し、numをリセットします。

この仕組みにより、3桁のコード(例:「104」→「h」)と2桁のコード(例:「44」→「,」、「33」→「!」)が混在する入力でも、元の文字列を正しく復元できます。サンプル入力「104101108108111443211911111410810033」は、「hello, world!」へと変換されます。

  1. C#で指定した文字列の値を等価なUnicode文字(char)に変換する方法

    C#では、Char.TryParseメソッドを使用することで、指定された文字列の値を等価なUnicode文字(char型)に変換できます。このメソッドは、変換が成功したかどうかを示すbool値を返し、成功した場合にはoutパラメータに変換結果の文字が格納されます。なお、Char.TryParseが成功するのは、対象の文字列がちょうど1文字である場合のみです。複数の文字を含む文字列は単一のchar型に変換できないため、変換は失敗します。例1:複数文字の文字列を変換する場合using System; public class Demo { public static void Main()

  2. C#のBoolean.TryParseで文字列をブール値(bool)に変換する方法

    論理値(ブール値)を表す指定された文字列を、対応するBoolean型の値に変換するには、Boolean.TryParseメソッドを使用します。このメソッドは、文字列が「true」または「false」として有効に解釈できる場合に変換を実行し、成否を戻り値として返します。 Boolean.TryParseメソッドの基本 TryParseメソッドの構成要素は以下の通りです。 第1引数: 変換対象の文字列 第2引数(outパラメータ): 変換結果を受け取るbool型変数 戻り値: 変換が成功した場合はtrue、失敗した場合はfalse 変換に失敗しても例外がスローされないため、ユーザー入力の検証な