2010-05-09 13 views
33

Potrzebuję uzyskać argument i przekonwertować go do int. Oto mój kod do tej pory:Jak przekonwertować argument wiersza poleceń na int?

#include <iostream> 


using namespace std; 
int main(int argc,int argvx[]) { 
    int i=1; 
    int answer = 23; 
    int temp; 

    // decode arguments 
    if(argc < 2) { 
     printf("You must provide at least one argument\n"); 
     exit(0); 
    } 

    // Convert it to an int here 

} 

Odpowiedz

59

Ponieważ ta odpowiedź została w jakiś sposób zaakceptowana, a zatem pojawi się na górze, mimo że nie jest najlepsza, poprawiłem ją na podstawie innych odpowiedzi i komentarzy.

Droga C; Najprostszym, ale będzie traktować każdą nieprawidłową liczbę jako 0:

#include <cstdlib> 

int x = atoi(argv[1]); 

C sposobem ze sprawdzaniem wejściowe:

#include <cstdlib> 

char *endptr; 
long int x = strtol(argv[1], &endptr, 10); 
if (!*argv[1] || *endptr) 
    cerr << "Invalid number " << argv[1] << '\n'; 

C++ sposób z kontroli wejścia:

#include <sstream> 

istringstream ss(argv[1]); 
int x; 
if (!(ss >> x)) 
    cerr << "Invalid number " << argv[1] << '\n'; 

Wszystkie trzy warianty zakładają to argc >= 2.

+2

Polecam przeciwko atoi: "Funkcja atoi() została uznana za przestarzałą przez strtol() i nie powinna być używana w nowym kodzie." – WhirlWind

+8

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. –

+2

@WhirlWind Nieokreślony przez kogo? –

1

Spójrz na strtol(), jeśli używasz standardowej biblioteki C.

18

Należy zauważyć, że argumenty main są niepoprawne. Standardowy formularz powinien być:

int main(int argc, char *argv[]) 

lub równoważnie:

int main(int argc, char **argv) 

Istnieje wiele sposobów, aby osiągnąć konwersję. Jest to jedno podejście:

#include <sstream> 

int main(int argc, char *argv[]) 
{ 
    if (argc >= 2) 
    { 
     std::istringstream iss(argv[1]); 
     int val; 

     if (iss >> val) 
     { 
      // Conversion successful 
     } 
    } 

    return 0; 
} 
+0

Oh opps to był mój błąd. Pierwotnie miałem to w ten sposób, ale potem zacząłem próbować różnych rzeczy i zapomniałem go zmienić. – nosedive25

+0

+1 Do włączenia, jeśli się powiedzie –

+0

świetny i czysty =) – marcelosalloum

3

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.

1

Podejście z istringstream można poprawić w celu sprawdzenia, czy nie ma innych znaków zostały wstawione po przewidywanym argumentu:

#include <sstream> 

int main(int argc, char *argv[]) 
{ 
    if (argc >= 2) 
    { 
     std::istringstream iss(argv[1]); 
     int val; 

     if ((iss >> val) && iss.eof()) // Check eofbit 
     { 
      // Conversion successful 
     } 
    } 

    return 0; 
} 
3

std :: Stoi z łańcucha może być również używany.

#include <string> 

    using namespace std; 

    int main (int argc, char** argv) 
    { 
     if (argc >= 2) 
     { 
      int val = stoi(argv[1]); 
      // ...  
     } 
     return 0; 
    } 
Powiązane problemy