2012-07-03 27 views
6

Mam program w C++, który uruchamiam dla wielu wartości parametru. Co chcę zrobić jest następujący: Powiedzmy mam dwa parametry:Wejście z wiersza poleceń

int main(){ 
    double a; 
    double b; 
//some more lines of codes 
} 

Teraz po po skompilować chcę uruchomić go jako

./output.out 2.2 5.4 

tak że a przyjmuje wartość 2,2 i b przyjmuje wartość 5.4.

Oczywiście jednym ze sposobów jest użycie cin>>, ale nie mogę tego zrobić, ponieważ uruchamiam program w klastrze.

+0

Dlaczego nie używać argumentów wiersza poleceń (np. Argv)? Oczywiście musisz później przekonwertować je na typ "double". – Mahesh

Odpowiedz

20

Trzeba użyć command line arguments w main:

int main(int argc, char* argv[]) { 
    if (argc != 3) return -1; 
    double a = atof(argv[1]); 
    double b = atof(argv[2]); 
    ... 
    return 0; 
} 

Kod ten analizuje parametry używając atof; możesz zamiast tego użyć stringstream.

+0

Nie używaj 'const char * argv []', po prostu użyj 'char * argv []', -1 aż do naprawienia. –

+0

@ RichardJ.RossIII Zostało to naprawione. – dasblinkenlight

+0

Teraz otrzymujesz +1 :) –

11

Jeśli chcesz używać parametrów wiersza polecenia, to nie, ty nie używać cin, ponieważ jest za późno. Musisz zmienić swój podpis main do:

int main(int argc, char *argv[]) { 
    // argc is the argument count 
    // argv contains the arguments "2.2" and "5.4" 
} 

Więc teraz masz argv który jest tablicą wskaźnik do char, każdy wskaźnik wskazujący na argument, że została podjęta. Pierwszym argumentem jest zazwyczaj ścieżka do pliku wykonywalnego, kolejne argumenty są tym, co zostało przekazane podczas uruchamiania aplikacji, w postaci wskaźników do char.

Konieczne będzie przekonwertowanie char* na double s w tym przypadku.

+2

Jestem prawie pewna, że ​​jest to 'int argc', a nie' size_t'. Popraw mnie, jeśli się mylę. – Linuxios

+0

@Linuxios: Tak, masz rację.Niektóre kompilatory dopuszczają 'size_t', ale standard tylko dopuszcza, że' int main() 'i' int main (int, char * []) ​​'są akceptowane, cokolwiek innego jest zdefiniowane przez implementację (no cóż, standard C++ 98, który I tak leżę w kółko ...) –

0

można użyć tej formy funkcji main() uzyskać argumenty wiersza poleceń

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

    } 

gdzie wartości tablicy argv[] zawierać zmienne wiersza polecenia jako char*, które będą potrzebne do konwersji floats lub doubles w sprawa

3

to właśnie argumenty wiersza polecenia są dla:

#include <sstream> 

int main(int argc, char *argv[]) 
{ 
    if (argv < 3) 
     // show error 
    double a, b; 

    std::string input = argv[1]; 
    std::stringstream ss = std::stringstream(input); 

    ss >> a; 

    input = argv[2]; 
    ss = std::stringstream(input); 

    ss >> b; 

    // a and b are now both successfully parsed in the application 
} 
3

Czy spojrzałeś na boost program options?

Przyjmuje argumenty wiersza poleceń, jak sugeruje wiele innych, i pozwala zapewnić bardzo spójny, czysty i rozszerzalny interfejs wiersza poleceń.

+1

Jeśli już używasz boost, to tak, to fajne, ale nie włączałbym boost do aplikacji tylko po to, by przetworzyć kilka prostych argumentów z linii poleceń. –

+1

Zawsze uważałem, że przetwarzanie argumentów zaczyna się od prostego i szybko wymyka się spod kontroli, wprowadzając subtelne błędy i ograniczenia, gdy narzędzie rośnie. – Zac

+0

Myślę, że to zależy od tego, jak skomplikowane mogą być twoje argumenty. Dla prostych argumentów typu "switch value" nigdy nie miałem problemu. –

Powiązane problemy