2017-04-09 69 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. 因此,比较项目将是相同的。

相关问题