int
main(int argc, char *argv[]) {
int n;
if (2 <= *argv[1] && *argv[1] <= 20){
n = *argv[1];
return 0;
}
そこで、n = argv[1] の値を設定しようとしています。入力"C: myprogram 4"
なので、出力は 4 になるはずです。ただし、n の値を出力すると、52 が返されました。これはなぜですか?
int
main(int argc, char *argv[]) {
int n;
if (2 <= *argv[1] && *argv[1] <= 20){
n = *argv[1];
return 0;
}
そこで、n = argv[1] の値を設定しようとしています。入力"C: myprogram 4"
なので、出力は 4 になるはずです。ただし、n の値を出力すると、52 が返されました。これはなぜですか?
の ASCII コードは、しかしで'4'
はありませ4
ん52
。文字列の代わりに実際の数値が必要な場合はatoi(argv[1])
、最初の引数を整数に変換するために使用します。
の型に注意してくださいargv[i]
:
main(int argc, char* argv[])
^
| argv[i] is a string.
その要素にインデックスを付けてアクセスする場合、*argv[i]
基本的にはint ではなく charです。それがchar の ASCII 値である'4'
と解釈される理由です。52
'4'
値を整数として扱うには、argv[i]
それを int に変換します。を使用してより良い変換int atoi (const char * str);
int n = atoi(argv[i]);
注: 以下はすべて異なります。
4 is a int
'4' is a char
"4" is a string (\0 terminated)
argc
さらに、 -- 引数カウンターを使用して main に渡された引数の数を確認することをお勧めします。
if(argc < NoOfArgumentsNeeded) {
// print error and exit
}
コマンドライン引数で何かを渡すと、それらはデフォルトで文字ストリームになり、に割り当てられ**argv
ます。フェッチargv[i][j]
すると、単一の文字が取得されます。
もしそうなら、あなたのケースargv[i]
にある文字列を取得"4"
します。だから、あなたがしようとしていることは間違っています。
あなたが得た理由52
は、文字のASCII値が4
ビルトイン52
を使用して、整数atoi(str)
などの文字列を変換できることです。次の
コードを参照してください。"438"
438
#include<stdio.h>
int
main(int argc, char *argv[]) {
int n=-1; //initialized to prevent garbage incase if case fails
if (2 <= atoi(argv[1]) && atoi(argv[1]) <= 20){
n = atoi(argv[1]);
}
printf("%d",n);
return 0;
}