2017-01-19 19 views
2

私は例えば、以下の行のようなコマンドを使用してプログラムを実行します私はCで私のプログラムを実行すると、コマンドラインを使用して入力いくつかのことができるようにする必要があります。その後、私は理想的だろうコマンドライン引数をCのdouble配列/ベクトルに読み込むにはどうすればよいですか?

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

さまざまなエントリは別々の変数に格納されます。カンマで区切られた最後のセット(0.0,0.5,1.0,1.5の数字)をMyVectorというベクトルとして保存するのが難しいです。私がしようとするとMyVectorに値を格納する行以外

#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]); 
    } 
} 

これらの作業のすべて:ここ

は、私が試したものの一例です。あなたが望んでいたよう

+2

コンマに達したときに停止する 'argv [5] 'を反復し、以前に反復された文字に対して' atof(...)'を呼び出す必要があります。あなたが 'argv [5]'の終わりに達するまですすぎ、繰り返す。 –

+2

確認したい場合は、 'atof()'の代わりに 'strtod()'を使うことをお勧めします!実際、 'strtod()'では、(次のコンマを最初に見つけ出す代わりに)あなたが変換し、それが提供する 'end'ポインタを利用することができます。 –

答えて

3

この

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

は動作しません。

0.0,0.5,1.0,1.5は単一の文字列です。ですから、それを補完して各要素を取り出し、atof()を使って変換を行う必要があります。 たとえば、strtok()を使用してトークン化することができます。

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

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

strtok()を使用する場合は、その落とし穴に注意してください。入力文字列を変更します。詳細は、strtok()を参照してください。

+0

完璧に作業しました。ありがとうございました。 – user3716193

+0

あるいは、 'strtod()'を使うことは、いくつかの面で優れているでしょう(コマンドライン引数をとりあえず残しておきます)。ここでは重大な問題ではありませんが、 'strtok()'は時々厄介な作業です(しかし、 'strtok_s()'や 'strtok_r()'は役に立ちます)。 –

関連する問題