2017-01-19 3 views
2

Je dois être en mesure de saisir plusieurs choses en utilisant la ligne de commande lorsque je lance mon programme en C. Je courrais le programme à l'aide d'une commande comme la ligne ci-dessous par exemple:Comment lire les arguments de la ligne de commande dans un double tableau/vecteur en C?

./programName 1 2.5 A.txt B.txt 0.0,0.5,1.0,1.5 

alors je devrais idéalement les différentes entrées stockées dans des variables distinctes. J'ai du mal à stocker le dernier ensemble de nombres séparés par des virgules, les nombres 0.0.0.5,1.0,1.5, comme un vecteur appelé MyVector.

Voici un exemple de ce que j'ai essayé:

#include <stdio.h> 
#include <stdlib.h> 
int main (int argc, char *argv[]){ 

    int x = atoi(argv[1]); // x = 1 
    float y = atof(argv[2]); // y = 2.5 
    char *AFileName = argv[3]; // AFileName = A.txt 
    char *BFileName = argv[4]; // BFileName = B.txt 
    double MyVector[4] = atof(argv[5]); // MyVector = [0.0,0.5,1.0,1.5] 

    printf("x = %d\n",x); 
    printf("y= %f\n",y); 
    printf("AFileName= %s\n",HFileName); 
    printf("BFileName= %s\n",AFileName); 

    for(int i=0;i<4;i++) 
    { 
     printf("MyVector[%d] = %f\n",i,MyVector[i]); 
    } 
} 

Tous ces travaux, sauf pour la ligne où je tente de stocker les valeurs dans myVector.

+2

Vous devez parcourir l'argument 'argv [5]' lorsque vous atteignez une virgule et appelez 'atof (...)' sur les caractères précédemment itérés. Rincez et répétez jusqu'à la fin de 'argv [5]'. –

+2

Je recommanderais d'utiliser 'strtod()' au lieu de 'atof()' si vous voulez une vérification! En fait, avec 'strtod()', vous pouvez convertir au fur et à mesure (au lieu de trouver d'abord la virgule suivante), et profiter du pointeur 'end' qu'il fournit. –

Répondre

3

Ce

double MyVector[4] = atof(argv[5]); // MyVector = [0.0,0.5,1.0,1.5] 

ne fonctionnera pas comme vous vouliez.

0.0,0.5,1.0,1.5 est une chaîne unique. Donc, vous devez l'analyser et récupérer chaque élément, puis faire la conversion en utilisant atof(). Vous pouvez utiliser strtok() pour marquer par exemple.

double MyVector[4]; 
char *p = strtok(argv[5], ","); 

size_t i = 0; 
while(p && i<4) { 
    MyVector[i++] = atof(p); 
    p = strtok(NULL, ","); 
} 

Si vous allez utiliser strtok() être au courant de ses pièges. Il modifie sa chaîne d'entrée. Voir strtok() pour plus de détails.

+0

A travaillé parfaitement. Je vous remercie. – user3716193

+0

Sinon, utiliser 'strtod()' serait meilleur à certains égards (en laissant l'argument de la ligne de commande non mutilé, entre autres). Pas un problème critique ici, mais 'strtok()' est parfois un mauvais travail (mais 'strtok_s()' ou 'strtok_r()' sont utiles et utilisables). –