2012-09-05 83 views
0

我將值作爲字符串添加到組合框中。以下是我的代碼。如何將值存儲在字符中

平臺 Windows XP和我使用微軟的Visual Studio 2003

語言 C++

遇到錯誤 - >「運行時檢查失敗#2 - 堆棧周圍的變量'緩衝區'被破壞了。「

如果我增加緩衝區的大小來說4和以上,那麼我不會得到這個錯誤。

我的問題是不是涉及到如何解決這個錯誤,但我想知道爲什麼我得到這個錯誤,如果緩衝區大小= 2

按照我的邏輯我給緩衝區大小= 2爲char [0 ]將存儲char [1] = Null終止字符的閥門。

現在,因爲焦炭可從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()); 
} 

難道你們,請給我關於我不理解的想法?

回答

3

itoa()零終止它的輸出,所以當你調用itoa(63, char[2], 10)寫入三個字符63和終止\0。但是你的緩衝區只有兩個字符長。

itoa()功能最好避免使用snprintf()boost::lexical_cast<>()

0

您正在將整數轉換爲ASCII,這就是itoa所做的。如果你有一個像183這樣的字符串,'1','8','3','\ 0'是四個字符。

每個字符需要一個字節,例如字符'1'是ASCII值爲0x31。

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的位數,加上一個用於終止空值。

你也可以使它足夠大以保存可以存儲在無符號整數中的最大值,該值可以是11(例如,4294967295的10位數加上終止的空值)。

0

ito函數用於根據第三個參數base將int轉換爲C sytle字符串。 作爲一個例子,它只是喜歡在printf中輸出int 63。您需要兩個ASII字節,一個用於存儲CHAR 6,另一個用於存儲CHAR 3.第三個應該爲NULL。所以在你的情況下,最大整數是三位數字。你需要4個字節的字符串

相關問題