it-swarm.com.de

Wie konvertiert man ein Befehlszeilenargument in int?

Ich muss ein Argument bekommen und es in ein int konvertieren. Hier ist mein Code bisher:

#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

}
44
nosedive25

Da diese Antwort irgendwie akzeptiert wurde und daher an der Spitze erscheinen wird, obwohl dies nicht die beste ist, habe ich sie anhand der anderen Antworten und der Kommentare verbessert.

Der C-Weg; am einfachsten, aber jede ungültige Zahl wird als 0 behandelt:

#include <cstdlib>

int x = atoi(argv[1]);

Der Weg mit der Eingangsprüfung:

#include <cstdlib>

errno = 0;
char *endptr;
long int x = strtol(argv[1], &endptr, 10);
if (endptr == argv[1]) {
  std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (*endptr) {
  std::cerr << "Trailing characters after number: " << argv[1] << '\n';
} else if (errno == ERANGE) {
  std::cerr << "Number out of range: " << argv[1] << '\n';
}

Der C++ - Iostream-Weg mit Eingabeüberprüfung:

#include <sstream>

std::istringstream ss(argv[1]);
int x;
if (!(ss >> x)) {
  std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (!ss.eof()) {
  std::cerr << "Trailing characters after number: " << argv[1] << '\n';
}

Alternative C++ - Methode seit C++ 11:

#include <stdexcept>
#include <string>

std::string arg = argv[1];
try {
  std::size_t pos;
  int x = std::stoi(arg, &pos);
  if (pos < arg.size()) {
    std::cerr << "Trailing characters after number: " << arg << '\n';
  }
} catch (std::invalid_argument const &ex) {
  std::cerr << "Invalid number: " << arg << '\n';
} catch (std::out_of_range const &ex) {
  std::cerr << "Number out of range: " << arg << '\n';
}

Alle vier Varianten gehen von argc >= 2 aus. Alle akzeptieren führenden Whitespace; Überprüfen Sie isspace(argv[1][0]), wenn Sie das nicht möchten. Alle außer atoi lehnen nachstehende Leerzeichen ab.

75
Thomas

Beachten Sie, dass Ihre main-Argumente nicht korrekt sind. Das Standardformular sollte sein:

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

oder gleichwertig:

int main(int argc, char **argv)

Es gibt viele Möglichkeiten, die Konvertierung zu erreichen. Dies ist ein Ansatz:

#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;
}
21
CB Bailey

std :: stoi from string könnte auch verwendet werden.

    #include <string>

    using namespace std;

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

Wie WhirlWind hervorgehoben hat, sind die Empfehlungen zur Verwendung von atoi nicht wirklich gut. atoi hat keine Möglichkeit, einen Fehler anzuzeigen. Daher erhalten Sie dieselbe Rückgabe von atoi("0"); wie von atoi("abc");. Das erste ist eindeutig von Bedeutung, das zweite ist jedoch ein klarer Fehler.

Er empfahl auch strtol, was vollkommen in Ordnung ist, wenn auch etwas unbeholfen. Eine andere Möglichkeit wäre die Verwendung von sscanf, etwa: 

if (1==sscanf(argv[1], "%d", &temp))
    // successful conversion
else
    // couldn't convert input

beachten Sie, dass strtol zwar etwas detailliertere Ergebnisse liefert - insbesondere wenn Sie ein Argument wie 123abc erhalten, würde der sscanf-Aufruf einfach sagen, dass er eine Zahl (123) konvertiert hat, wohingegen strtol Sie nicht nur anrufen würde , aber auch ein Zeiger auf die a (dh den Anfang des Teils, das er nicht in eine Zahl konvertieren könnte).

Da Sie C++ verwenden, können Sie auch boost::lexical_cast verwenden. Dies ist fast so einfach wie atoi, bietet aber (ungefähr) den gleichen Detaillierungsgrad bei der Berichterstellung von Fehlern wie strtol. Der größte Aufwand besteht darin, dass es Ausnahmen auslösen kann. Daher muss Ihr Code ausnahmesicher sein. Wenn Sie C++ schreiben, sollten Sie das trotzdem tun, aber es zwingt das Problem irgendwie.

3
Jerry Coffin

Der Ansatz mit istringstream kann verbessert werden, um zu überprüfen, dass nach dem erwarteten Argument keine weiteren Zeichen eingefügt wurden:

#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;
}
1
andrey

Schauen Sie sich strtol () an, wenn Sie die C-Standardbibliothek verwenden.

1
WhirlWind

So können wir das machen ....

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

    int a, b, c;
    *// Converting string type to integer type
    // using function "atoi( argument)"* 

    a = atoi(argv[1]);     
    b = atoi(argv[2]);
    c = atoi(argv[3]);

 }
0
Ramanand Yadav