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]

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],c++,C++,这是给出错误的代码部分: //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]; }

这是给出错误的代码部分:

//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;
}
//在头文件中
字符m_sku[最大sku长度+1];
//在cpp文件中
char*Item::sku()常量
{
整数长度=strlen(m_sku);
char*arr=新字符[长度]();
对于(int i=0;i编写一个静态强制转换(int)strlen(m_sku),反之亦然std::size_t i=0。

因此,比较的项目将是相同的。

解决此问题最简单的方法是将
i
设置为无符号变量,而不是有符号变量。您可以使用
size\u 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];
}

int I
更改为
std::size\u t
后者是无符号的,是strlen()返回的类型它永远不可能是负数。比较无符号整数和有符号整数可能会导致一些很难找到的问题,因此会出现警告。警告是因为两个整数都转换为无符号整数,如果其中一个为负数,它将变成一个大的正数,因此可以得到一些非常奇怪的结果。可能会重复
// oops! This is an infinite loop:
for (size_t i = length-1; i >=0; i--) {
    arr[i] = m_sku[i];
}