2017-04-09 2 views
0

Ich bin neu in C++. Ich brauche Hilfe dieses Fehler Fixierung:C++ Vergleich zwischen Ganzzahlausdrücken mit Vorzeichen und ohne Vorzeichen

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

Dies ist der Teil des Codes, der den Fehler geben:

//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

Änderung 'int I' zu 'std :: size_t' Letzteres ist unsigned und ist der Typ von strlen(), der niemals negativ sein kann. Das Vergleichen von nicht signierten und signierten Ints kann zu einigen sehr schwer zu findenden Problemen führen, daher die Warnung. Die Warnung ist, weil beide Ints in unsigned konvertiert werden und wenn eins negativ ist, wird es eine große positive Zahl, so dass Sie einige wirklich merkwürdige Ergebnisse erhalten können. Mögliches Duplikat von http://stackoverflow.com/questions/5416414/signed-unsigned-comparisons – doug

Antwort

0

Der einfachste Weg, um dies zu beheben, ist i eine vorzeichenlose Variable statt einer vorzeichenbehafteten zu machen. Sie können size_t verwenden den Rückgabetyp von strlen zu entsprechen:

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

Aber Vorsicht, da diese gleiche Ersatz nicht mit Schleifen funktioniert, die nach unten zählen zu 0.

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

Schreibe eine statische Guss (int) Strlen (m_sku) oder umgekehrt std: : size_t i = 0. So dass die verglichenen Elemente gleich sein werden.

Verwandte Themen