2017-08-07 4 views
0

J'ai un programme qui prend des entrées à partir de la ligne de commande et les utilise en avance. Pendant ce temps, les entrées ont été données séparément après la commande d'appel par exemple ./a.out 1 2 3 4 5 et il était assez facile de les utiliser (permet de les résumer seulement pour le moment) -chaîne à des entiers de 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; 
} 

mais maintenant le format d'entrée a changé à ./a.out "1 2 3 4 5" et ce La méthode ne fonctionne pas correctement. J'ai essayé de prendre "1 2 3 4 5" à une chaîne, mais je ne peux pas en extraire les entiers. Je ne peux pas non plus penser à une autre solution en ce moment. Existe-t-il une méthode élégante pour les sortir de l'argv sans trop de complexité?

+0

(Pourquoi le format des arguments changé Tout comme partie d'une leçon?) Astuce: vous voulez diviser la chaîne sur le caractère d'espace pour se retrouver avec un tableau de (chaîne de représentations de) nombres que vous pouvez convertir en utilisant 'atoi'. Ou, vous pouvez diffuser l'entrée en un seul numéro à la fois. – struthersneil

+0

@struthersneil pas de leçons, j'apprends tout seul et un autre programme passe les entrées suivantes comme ceci à mon programme. –

+0

C'est cool, et honnêtement la pratique auto-dirigée et la recherche est la seule façon d'apprendre. J'étais juste curieux de savoir qui contrôlait l'entrée. – struthersneil

Répondre

4

Vous devez diviser la chaîne. Vous pouvez le faire par exemple en utilisant les flux de chaîne:

#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

[Démo] (https://wandbox.org/permlink/L11xMfWXRKm1RjYW) –