Wann sscanf()
oder eine andere Funktion aus der scanf
Familie erhält eine Ziffernfolge, deren umgerechneter Wert den Maximalwert des Zieltyps Integer überschreitet,
- soll die Konvertierung als gescheitert gelten?
- Ist das Verhalten überhaupt definiert?
Aus dem Standard 7.21.6.2p10 ((f)scanf
gilt für die ganze Familie):
… Wenn dieses Objekt keinen passenden Typ hat, oder kann das Ergebnis der Konvertierung nicht im Objekt dargestellt werden, ist das Verhalten undefiniert.
Sieht nach einem weiteren Grund aus, sehr vorsichtig mit dem zu sein scanf
Familie. Das strtoXX
Funktionen haben ein vollständig definiertes Verhalten. Sie kehren zurück LONG_MAX
etc. für zu große Eingabe und Set errno == ERANGE
. Wenn Sie also genaue Informationen benötigen, tokenisieren Sie die Eingabe manuell und verwenden Sie diese Funktionen zur Konvertierung. Ein weiterer Vorteil: bessere Fehlerbehandlung.
Die Frage ist subtiler: Das Parsen der Subjektsequenz hat das Verhalten wie folgt definiert
strtol()
aber den resultierenden Wert in an speichernint
hat ein Implementierungsverhalten, wenn der Wert zu groß ist, und wenn die Bibliotheksfunktion auf Überlauf testet, was sie sollte, sollte dieser Überlauf als Konvertierungsfehler angesehen werden, der zu einer kurzen Zählung führt, oder nicht?– chqrlie
24. Juni 2017 um 20:18 Uhr
@WeatherVane: Empirische Tests sind eine schlechte Referenz für das Verhalten von C-Code.
– zu ehrlich für diese Seite
24. Juni 2017 um 20:24 Uhr
@Olaf das ist wohl der Grund für die FWIW …
– Benutzer2371524
24. Juni 2017 um 20:25 Uhr
@KeithThompson: Der Titel lässt etwas Raum für definiertes Verhalten, aber der Hauptteil der Frage ist eindeutig: eine Folge von Ziffern gegeben, deren konvertierter Wert den Maximalwert für den Integer-Typ überschreitet.
– chqrlie
24. Juni 2017 um 20:51 Uhr
@KeithThompson: Das Verhalten ist in der Tat iff definiert
INT_MAX >= 123456789123456789123456789
. Das>=
ist genauer, obwohl ich glaubeINT_MAX
muss eine Potenz von 2 minus 1 sein.– chqrlie
24. Juni 2017 um 21:02 Uhr