2017-04-09 171 views
0

我是新來的C++。我需要幫助解決這個錯誤:有符號和無符號整數表達式之間的C++比較

Item.cpp: In member function ‘char* ict::Item::sku() const’: 
Item.cpp:65:36: warning: comparison between signed and unsigned integer 
expressions [-Wsign-compare] 

這是給錯誤的部分代碼:

//in header file 
char m_sku[MAX_SKU_LEN + 1]; 

//in cpp file 
char* Item::sku() const 
{ 
    int length = strlen(m_sku); 
    char *arr = new char[length](); 
    for (int i = 0; i <= strlen(m_sku); i++) { 
     arr[i] = m_sku[i]; 
    } 
    return arr; 
} 
+2

變化'INT I'以循環工作'std :: size_t'後者是無符號的,並且是由strlen()返回的類型,它永遠不會是負數。比較無符號和有符號整數可能會導致一些很難發現的問題,因此警告。警告是因爲兩個整數都被轉換爲無符號數,如果其中一個是負數,那麼它就成爲一個很大的正數,所以你可以得到一些非常奇怪的結果。可能的重複http://stackoverflow.com/questions/5416414/signed-unsigned-comparisons – doug

回答

0

解決這個問題最簡單的方法是將i設爲無符號變量而不是簽名變量。您可以使用size_t匹配的strlen的返回類型:

size_t length = strlen(m_sku); 
char *arr = new char[length](); 
for (size_t i = 0; i <= length; i++) { 
    arr[i] = m_sku[i]; 
} 

但要小心,因爲這個相同的替換並不與倒數至0

// oops! This is an infinite loop: 
for (size_t i = length-1; i >=0; i--) { 
    arr[i] = m_sku[i]; 
} 
0

寫靜態澆鑄(INT)strlen的(m_sku)或反之亦然STD: :size_t i = 0. 因此,比較項目將是相同的。

相關問題