3

文字列を 16 進数に変換する C++ プログラムを実行しています。それはコンパイルされますが、実行時に次のようにエラーが発生します。

デバッグ アサーションに失敗しました! (大野!)

Visual Studio2010\include\xstring

1440号線

式: 文字列の添字が範囲外です

そして、中止するしかありません...エラーのポイントまでは変換しているように見えるので、何が起こっているのかわかりません。私のコードは簡単です:

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
    string hello = "Hello World";
    int i = 0;
    while(hello.length())
    {
        cout << setfill('0') << setw(2) << hex << (unsigned int)hello[i];
        i++;
    }

    return 0;
}

このプログラムがすべきことは、各文字を 16 進数 (文字ごと) に変換することです。

4

5 に答える 5

6

文字列から何も削除していないため、length()常に に変換される同じ数値が返されtrueます。

代わりに for ループを使用します。

for(int i = 0; i < hello.length(); ++i)
{
    cout << setfill('0') << setw(2) << hex << (unsigned int)hello[i];
}

またはさらに良いことに、イテレータを使用します。

for(std::string::iterator it = hello.begin(); it != hello.end(); ++it)
{
    cout << setfill('0') << setw(2) << hex << *it;
}
于 2012-04-17T06:14:50.763 に答える
4

while 条件が正しくありません:

while(hello.length())

ループは決して終了せず、i大きくなり (文字列の長さから 1 を引いたもの)、そのインデックスで文字列にアクセスすると、ランタイム アサーションが取得されます。

次のように変更します。

while(i < hello.length())

または、イテレータを使用することをお勧めします。

于 2012-04-17T06:15:04.970 に答える
2
while(i < hello.length())
    {
        cout << setfill('0') << setw(2) << hex << (unsigned int)hello[i];
        i++;
    }

元のループが終わることはありません。インデックスのカウントには、forループ構文の方が適していると思います。

于 2012-04-17T06:14:17.957 に答える
0

while ループに条件がありません。

 while(i < hello.length())
    {
        cout << setfill('0') << setw(2) << hex << (unsigned int)hello[i];
        ++i;
    }
于 2012-04-17T06:17:18.870 に答える
0

ここでは、for ループでイテレータを使用することをお勧めします。

for (std::string::const_iterator it = hello.begin(); it != hello.end(); ++it) {
    // String processing
}

または、C++11 では:

for (char const c : hello) {
    // String processing
}

一般に、私は C++ で可能な限りイテレータを使用してアクセスすることを好みます。これはより慣用的な方法であり、すべてのタイプの STL コンテナーで機能します。たとえば、いつかstd::dequeまたはを使用したい場合std::list、イテレータは引き続き機能します。

別のスタイル ノートでは、C スタイルのキャストは避けます。それがあなたがしたところです(unsigned int)。代わりに、を使用してstatic_cast<unsigned> (*it)ください。これは、実際に求めているキャスティング能力のみを与えることで、意図を伝えます。C スタイルのキャストははるかに広いですが、ここで必要なのは整数型のサイズを変換することだけです。

于 2012-04-17T06:17:25.753 に答える