2017-08-07 4 views
0

Ich habe ein Programm, das Eingabe von der Befehlszeile nimmt und sie im Voraus verwendet. Die ganze Zeit über die Eingänge wurden getrennt nach dem Aufrufbefehl zB ./a.out 1 2 3 4 5 gegeben und es war recht einfach, sie verwenden (lässt sie einfach Summe für den Moment) -String zu ganzen Zahlen von argv

#include <iostream> 
#include <cstdlib> 

int main(int argc, char **argv) { 
    int sum = 0; 
    for(int i = 1; i < argc; ++i) { 
     sum += std::atoi(argv[i]); 
    } 
    std::cout << sum << std::endl; 
} 

aber jetzt ist das Eingabeformat hat sich geändert ./a.out "1 2 3 4 5" und diese Methode funktioniert nicht korrekt. Ich habe versucht, "1 2 3 4 5" zu einem String zu nehmen, aber dann kann ich nicht die ganzen Zahlen daraus bekommen. Ich kann mir im Moment auch keine andere Lösung vorstellen. Gibt es irgendeine elegante Methode, um sie ohne allzu große Komplexität aus dem Spiel zu bringen?

+0

(Warum hat das Argument Format geändert nur als Teil einer Lektion?) Hinweis: Sie die Zeichenfolge auf das Leerzeichen am Ende mit einer Reihe teilen mögen von (Stringdarstellungen von) Zahlen, die Sie mit 'atoi' konvertieren können. Oder Sie können die Eingabe als eine Zahl auf einmal streamen. – struthersneil

+0

@struthersneil keine Lektionen, ich lerne alleine und ein anderes Programm übergibt die folgenden Eingaben so an mein Programm. –

+0

Das ist cool, und ehrlich selbst geführte Praxis und Untersuchung ist der einzige Weg zu lernen. Ich war nur neugierig, wer den Input kontrolliert hat. – struthersneil

Antwort

4

Sie müssen die Zeichenfolge aufteilen. Sie können dies tun, zum Beispiel unter Verwendung von String-Streams:

#include <iostream> 
#include <sstream> 

int main(int argc, char **argv) { 
    int sum = 0; 
    for(int i = 1; i < argc; ++i) { 
     std::istringstream iss(argv[i]); 
     for (int n; iss >> n;) sum += n; 
    } 
    std::cout << sum << std::endl; 
} 
+0

[Demo] (https://wandbox.org/permlink/L11xMfWXRKm1RjYW) –