2016-11-10 18 views
1

コマンドライン引数でプログラムを実行しています。私は10、10、10を入力し、それらをプリントアウトする場合でも、それはプリントアウト49、49、49ここに私のコードです:Cのコマンドライン引数から整数を表示する

int main(int argc, char *argv[]) { 
    int seed = *argv[0]; 
    int arraySize = *argv[1]; 
    int maxSize = *argv[2]; 

ですが、なぜでしょう?

答えて

1

まあ、argvは、文字列へのポインタの配列です。すべてのコマンドライン引数はの文字列として渡され、それぞれのポインタはargv[n]で保持されます。引数のシーケンスはn+1です。 argcの値がゼロよりも大きい場合C11、章§5.1.2.2.1

を引用するホストされた環境のために

、文字列はargv[0] によって指さプログラム名を表し; argv[0][0]は、 プログラム名がホスト環境から利用できない場合は、ヌル文字になります。 argcの値が より大きい場合、argv[1]からargv[argc-1] の指す文字列は、プログラムパラメータを表します。

ので、はっきりと、

./123 10 10 10 // 123のような実行のためのバイナリ名

  • argv[0]は、最初の「コマンドライン引数ではありませんプログラムに渡されました "。それはargv[1]です。
  • *argv[1]コマンドライン引数として渡した値のintが返されません。

    基本的には、*argv[1]はあなた(あなたのプラットフォームが使用しています)その文字列(すなわち、'1'char値)、最も可能性のASCIIでエンコードされた値の最初の要素の値を与える、ANSD ascii tableに応じ'1'表示される小数点は49です。

ソリューション:あなたは

  • ループ
  • が入力文字列へのそれぞれの変換argv[1] ~ argv[n-1]argc == nながら、各引数の文字列の上に引数の数(argc)のため

    • チェックする必要がありますint(この場合、strtol()を使用できます)
  • 1

    文字列(*argv[x])を間接参照することはあなたにchar(文字列の最初の文字の値)を与えるが、この場合には値がASCII '1'です:あなたは(デリファレンスなし)これらの文字列を変換することができます

    49進あなたのプログラムの名前がとにかくargv[0]

    int arraySize = (int)strtol(argv[1], NULL, 10); 
    

    strtolをされ使用して、あなたはプログラム名が1で始まることを確信していますか?

    関連する問題