2016-06-07 13 views
5

Das folgende C++ Programm ruft strtoul von negativen 1. Da keine negativen Zahlen in einem unsigned Typ darstellbar sind, hatte ich erwartet, dass dies fehlschlägt und 0 zurückgibt (If no valid conversion could be performed, a zero value is returned.), sondern eine große positive Zahl wird zurückgegeben (If the value read is out of the range of representable values by an unsigned long int, the function returns ULONG_MAX (defined in <climits>), and errno is set to ERANGE.).C/C++ strtoul negative Zahl

#include <cstdlib> 
#include <iostream> 

int main() { 
    {char s[] = "-1"; 
    for (int b=0; b<17; ++b) 
     std::cout << "strtoul (unsigned) of " << s 
       << " with base arg " << b 
       << ": " << strtoul(s,0,b) << std::endl;} 
} 

Warum schlägt strtoul nicht fehl und gibt 0 für negative Zahlen zurück?

+1

Was ist Ihr Betriebssystem? Compiler? C/C++ Laufzeit? –

+0

@AndrewHenle. Irrelavant in diesem Fall. Die Funktion demonstriert korrektes Verhalten. –

+1

@Galik. Nicht wahr. Es gibt ** nur ** vorzeichenlose Zahlen zurück. –

Antwort

2

Sie ein bessere Nutzung cppreference.com für documentation scheint es viel genauer zu sein:

wenn das Minuszeichen Teil der Eingangssequenz ist, der numerische Wert aus der Folge von Ziffern berechnet wird negiert als if by unary minus im Ergebnistyp, der vorzeichenlose Integer-Wraparound-Regeln anwendet.

und da es optional Plus- oder Minuszeichen erwähnt ist ein gültiges Symbol

+3

Was ist an der Dokumentation von cplusplus.com falsch? –

+0

Zumindest ist es nicht so vollständig wie dieses, was bedeutet, dass es nicht genau ist – Slava

+0

@BenjaminLindley.Die Tatsache, dass sie '++' geschrieben haben, anstatt die deutlich verständlichere Kürzung zu verwenden. –

2

Per the POSIX standard:

Seit 0, {ULONG_MAX} und {ULLONG_MAX} auf Fehler zurückgegeben werden und gelten auch Renditen auf Erfolg, eine Anwendung zu wollen prüfen Fehlersituationen errno-0 setzen sollten, rufen Sie dann strtoul() oder strtoull(), dann überprüfen Sie errno.

Sie müssen überprüfen errno.

+0

errno ist mindestens 0 für RH 6.6 und gcc 5.1.0 – Slava

+0

@Slava '-1' wäre nicht" außerhalb des Bereichs der darstellbaren Werte ". –

0

Aus einer anderen Referenz: cppreference.com:

Rückgabewert

Wert Integer den Inhalt entspricht auf Erfolg. Wenn der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, tritt der Fehler auf, und ULONG_MAX oder ULLONG_MAX werden zurückgegeben. Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.

Welche als cplusplus.com offenbar anders

Verwandte Themen