Jak Whirlwind wskazał, zalecenia używać atoi
nie są naprawdę bardzo dobre. atoi
nie ma możliwości wskazania błędu, więc otrzymasz taki sam zwrot z atoi("0");
, jak z atoi("abc");
. Pierwsza jest wyraźnie znacząca, ale druga to wyraźny błąd.
Polecił także strtol
, co jest całkiem w porządku, jeśli trochę niezgrabne. Inną możliwością byłoby wykorzystanie sscanf
, coś jak:
if (1==sscanf(argv[1], "%d", &temp))
// successful conversion
else
// couldn't convert input
nuta że strtol
daje nieco bardziej szczegółowe wyniki, choć - zwłaszcza, jeśli masz argument jak 123abc
, wywołanie sscanf
byłoby po prostu powiedzieć, że nawrócił liczba (123), podczas gdy strtol
nie tylko wyśle ci numer, ale także wskaże na a
(tj. początek części, którą może , a nie przekonwertować na liczbę).
Ponieważ używasz C++, możesz również rozważyć użycie boost::lexical_cast
. Jest to prawie tak proste w użyciu, jak atoi
, ale zapewnia również (w przybliżeniu) ten sam poziom szczegółów w raportowaniu błędów, co strtol
. Największym wydatkiem jest to, że może on generować wyjątki, więc aby go użyć, Twój kod musi być wyjątkowo bezpieczny. Jeśli piszesz C++, powinieneś to zrobić mimo wszystko, ale to zmusza problem.
Polecam przeciwko atoi: "Funkcja atoi() została uznana za przestarzałą przez strtol() i nie powinna być używana w nowym kodzie." – WhirlWind
Co powiesz na fakt, że nie da się stwierdzić, czy konwersja rzeczywiście miała miejsce z 'atoi'? Wydawałoby się to całkiem niezłym powodem, aby unikać "atoi" do mnie. –
@WhirlWind Nieokreślony przez kogo? –