0

いろいろやってみました。残念ながら、私は以前のコードの記録を保持していないので、現在持っているものをお見せします。

    string l2n(std::string input) {
    std::string original[26] = {"A","B","C","D","E", "F", "G", "H", "I", "J", "K," "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
    //std::string originalLower[26] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
    std::string newval[26] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
    string neworig = (original[0], original[1], original[2], original[3], original[4], original[5], original[6], original[7], original[8], original[9], original[10], original[11], original[12], original[13], original[14], original[15], original[16], original[17], original[18], original[19], original[20], original[21], original[22], original[23], original[24], original[25]);
    string newnewval = (newval[0], newval[1], newval[2], newval[3], newval[4], newval[5], newval[6], newval[7], newval[8], newval[9], newval[10], newval[11], newval[12], newval[13], newval[14], newval[15], newval[16], newval[17], newval[18], newval[19], newval[20], newval[21], newval[22], newval[23], newval[24], newval[25]);
    size_t posit = input.find(neworig.c_str());
    string hash2345;
    hash2345 = input.replace(posit, std::string(neworig).length(), newnewval.c_str());
    return hash2345;
}

これは正常にコンパイルされますが、入力「HELLO」で「26HELLO」を出力します。文字通り、与えられた入力の先頭に26を追加するだけです。input.replaceの使用法と関係があると思いますが、他に何をすべきかわからず、googleは見つかりません。なんでも。ご協力いただきありがとうございます!

4

2 に答える 2

1

あなたは何をするのか誤解していると思いますstring::replace。ある文字列内の文字を、別の文字列内の同じ位置にある文字に置き換えることはありません。ある文字列内の一連の文字を別の文字列全体に置き換えます。

例えば、

std::string test = "This is a test.";

// Replace 2 characters, starting at position 5 with "was"
test.replace(5, 2, "was");

std::cout << test;  // Outputs "This was a test."

あなたがしていることのために、入力の各文字に対してアクションを実行するループが必要になります。

string hash2345;

// For each character in input
for (int i = 0; i < input.length(); ++i) {

  // Try to find the string equal to the i'th character of input in 
  // the "original" array.
  string* original_val_ptr = std::find(original, original + 26, 
                                       std::string(input[i]));

  // Make sure that it actually found something (this handles the case
  // where input has some other characters, like lowercase or punctuation).
  if (original_val_ptr != NULL) {

    // Find the position of this value in the original array.
    size_t pos = original_val_ptr - original;

    // Add the string in the equivalent position in the "newval" array
    // to the output.
    hash2345 += newval[pos];
  }
}

return hash2345;

現在、コードに追加できる改善点がいくつかあります。他の回答がそれらを示唆していると確信していますが、あなたが比較的新しいプログラマーであるように思われるため、この回答を次のように簡単にすることを選択しています。可能であり、明らかに実装しようとしているアルゴリズムの正確性のみに焦点を当てます。

また、これは、文字から数字でなくても、ある文字セットを別の文字セットにマッピングする場合に機能します。

于 2012-11-22T17:16:11.057 に答える
0

上記のコメントに基づいて、ASCIIを使用していると仮定すると、次のようになります。

string l2n(std::string input)
{
    ostringstream buf;
    for (string::const_iterator i = input.begin(); i != input.end() ++i)
    {
        buf << (*i - 'A') + 1;
    }
    return buf.str();
}
于 2012-11-22T17:13:03.777 に答える