0

文字列としてコンボボックスに値を追加しています。以下は私のコードです。

プラットフォーム WindowsXPと私はMicrosoftVisualStudio2003を使用しています

言語C++

エラーが発生しました->「ランタイムチェックの失敗#2-変数「バッファ」の周りのスタックが破損しました。」

バッファのサイズを4以上に増やすと、このエラーは発生しません。

私の質問はそのエラーを修正する方法とは関係ありませんが、バッファサイズ=2の場合になぜこのエラーが発生したのか疑問に思っています。

私の論理によれば、char[0]はchar[1] = nullで終了する文字のバルブを格納するため、バッファサイズ=2を指定しました。

charは0から255までの値を格納できるので、挿入された値は1から63まで、次に183から200までなので、これで問題ないと思いました。

CComboBox m_select_combo;
const unsigned int max_num_of_values = 63;

m_select_combo.AddString( "ALL" );

for( unsigned int i = 1; i <= max_num_of_values ; ++i )
{
    char buffer[2];
    std::string prn_select_c = itoa( i, buffer, 10 ); 
    m_select_combo.AddString( prn_select_c.c_str() );
}

const unsigned int max_num_of_high_sats = 202 ;

for( unsigned int i = 183; i <= max_num_of_high_sats ; ++i )
{
    char buffer[2];
    std::string prn_select_c = itoa( i, buffer, 10 ); 
    m_select_combo.AddString( prn_select_c.c_str() );
}

何がわからないのか教えていただけませんか?

4

4 に答える 4

3

itoa()出力をゼロで終了するため、呼び出すitoa(63, char[2], 10)と 3 つの文字が書き込まれ63終了文字が\0. しかし、バッファの長さはわずか 2 文字です。

itoa()snprintf()function は、 orを優先して避けるのが最善boost::lexical_cast<>()です。

于 2012-09-05T14:57:35.857 に答える
0

整数を ASCII に変換してitoaいます。183 のような 4 文字の文字列 '1'、'8'、'3'、'\0' のような数字がある場合。

各文字は 1 バイトを使用します。たとえば、文字 '1' は ASCII の値 0x31 です。

于 2012-09-05T14:57:04.483 に答える
0

のドキュメントを読む必要がありますitoa

次のループを検討してください。

for( unsigned int i = 183; i <= max_num_of_high_sats ; ++i ) 
{ 
    char buffer[2]; 
    std::string prn_select_c = itoa( i, buffer, 10 );  
    m_select_combo.AddString( prn_select_c.c_str() ); 
} 

最初の反復では、整数183が 3 文字の文字列 "183" と終端の null 文字に変換されます。これは、2 バイト配列に詰め込もうとしている 4 バイトです。ドキュメントでは、バッファが値を保持するのに十分な大きさであることを確認するように具体的に指示しています。この場合、少なくともlongの桁数にmax_num_of_high_sats終端の null の 1 を加えた数にする必要があります。

unsigned int に格納できる最大値を保持するのに十分な大きさにすることもできます。これは 11 になります (たとえば、4294967295 の 10 桁と終端の null)。

于 2012-09-05T15:01:40.033 に答える
0

ito 関数は、3 番目のパラメーター base に基づいて int を C sytle 文字列に変換するために使用されます。例として、printf で int 63 を出力したいだけです。2 つの ASII バイトが必要です。1 つは CHAR 6 の格納に使用され、もう 1 つは CHAR 3 の格納に使用されます。3 番目は NULL にする必要があります。したがって、あなたの場合、最大 int は 3 つのデジタルです。文字列には4バイトが必要です

于 2012-09-05T15:01:42.357 に答える