私はこのコード引数行からの数値の取得方法は?
#include<stdio.h>
int main(int argc, char * argv[]){
printf("%i\n", (int) *argv[1])
}
私は6 ./a.outコマンドでコンパイルされたコードを実行するとき、それは数54を出力しますが、私は正確に6
私はこのコード引数行からの数値の取得方法は?
#include<stdio.h>
int main(int argc, char * argv[]){
printf("%i\n", (int) *argv[1])
}
私は6 ./a.outコマンドでコンパイルされたコードを実行するとき、それは数54を出力しますが、私は正確に6
コマンドライン引数をCとして渡される必要があります文字列ではなく、数字として扱われます。 C文字列は、数値自体ではなく、文字列へのポインタであるため、対応する数値にキャストすることはできません。
6
を表す文字列、つまり"6"
を最初の文字にキャストしようとすると、int
になります。 char
は整数型ですが、システム上の文字コードが'6'
であるため、6ではなく54が得られます。
あなたは適切な変換を行うためにatoi
を使用することができます。
int n = atoi(argv[1]);
printf("%i\n", n);
あなたはこれをコンパイルするためには<stdlib.h>
を含める必要があります。
まず、char *
をint
にキャストすることはできません。 atoi();
をご覧ください。 次に、10進数のみを印刷する場合は、%i
の代わりに%d
フラグを使用してください。すべての引数を出力する場合は、%s
フラグを使用する必要があります。したがって、引数をキャストする必要はありません。
最後に、あなたのコードでは、引数ではなく値のポインタを出力します。 6はASCII値である54を指しているようです。 あなたは以下のように行うことができ、値を印刷するには:
printf("%d\n", atoi(argv[1]));
OR printf("%s\n", argv[1]);
あなたはintに、char *をキャストするタイプです。これにより、そのASCII値が得られます。 %iと%dは同じもの、つまり符号付き整数を指します。
は参照してください:Format specifiers in C
をあなたは税引後営業利益(ARGV 1)を使用した場合など、他のASCII文字があってはならない覚えておいてください、次の
printf("%s", argv[1]);
または
printf("%d", atoi(argv[1]));
を使用することができます - 、 +などこれらの場合atoi()は0を返します。atoi()はエラーを検出しません(参照:http://linux.die.net/man/3/atoi)。したがって、これらの文字すべてを引数から取り除き、純粋な数字だけを渡すことを忘れないでください。また、あなたがそれのように落ちた場合は、自分でatoi()を書くこともできます。
引数は文字列の配列として渡されます。あなたは[文字列を変換する]必要があります(http://en.cppreference.com/w/c/string/byte/strtol)。 –
ああ、配列の文字列のいずれかを使用しようとすると、引数が実際に渡されているかどうかを確かにチェックする必要があります。例:チェックライン 'if(argc> 1){/ *少なくとも1つの引数を持つ* /}' –