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;
}