值如何存储在char中

时间:2012-09-05 14:52:11

标签: c++ visual-studio visual-c++

我将值作为字符串添加到组合框中。以下是我的代码。

平台 Windows XP和我正在使用 Microsoft Visual Studio 2003

语言 C ++

遇到错误 - > “运行时检查失败#2 - 变量'缓冲区'周围的堆栈已损坏。”

如果我将缓冲区的大小增加到4以上,那么我就不会收到此错误。

我的问题与如何解决该错误无关,但我想知道为什么如果缓冲区大小= 2,我会收到此错误。

根据我的逻辑,我给缓冲区大小= 2,因为char [0]将存储char [1] = null终止字符的阀门。

现在,由于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 个答案:

答案 0 :(得分:3)

itoa()将其输出置零,因此当您致电itoa(63, char[2], 10)时,它会写入三个字符63和终止\0。但是你的缓冲区只有两个字符长。

最好避免使用

itoa()函数,以支持snprintf()boost::lexical_cast<>()

答案 1 :(得分:0)

您正在将整数转换为ASCII,这是itoa的作用。如果你有一个像183这样的数字作为一个字符串的四个字符,'1','8','3','\ 0'。

每个字符占用一个字节,例如字符“1”是ASCII中的值0x31。

答案 2 :(得分: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”,加上一个终止空字符。这是4个字节,你试图塞进一个双字节数组。文档会特别告诉您确保缓冲区足够大以容纳任何值;在这种情况下,它应该至少 max_num_of_high_sats长的位数,加上一个用于终止空值。

你也可以使它足够大,以保存你可以存储在unsigned int中的最大值,即11(例如,对于4294967295加上一个终止空值为10位)。

答案 3 :(得分:0)

ito函数用于根据第3个参数库将int转换为C sytle字符串。 例如,它只是打印出printf中的int 63。你需要两个ASII字节,一个用于存储CHAR 6,另一个用于存储CHAR 3.第三个应该是NULL。所以在你的情况下,max int是三位数字。你需要字符串中的4个字节