2017-04-09 49 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'に向けてカウントダウンループでは動作しませんので、

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

しかし、注意してください:あなたは、strlen関数の戻り値の型と一致するようにsize_tを使用することができます'std :: size_t'後者は符号なしで、strlen()によって返される型であり、決して負であってはいけません。符号なし整数と符号付き整数を比較すると、問題を見つけるのが非常に難しくなるため、警告が表示されます。警告は、両方のintが符号なしに変換され、1つが負の場合は大きな正の数になり、結果的に奇妙な結果が得られるためです。 http://stackoverflow.com/questions/5416414/signed-unsigned-comparisonsの可能な複製 – doug

答えて

0

これを修正する最も簡単な方法は、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 比較項目が同じになるようにします。

関連する問題