-1
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 が返されました。これはなぜですか?

4

3 に答える 3

3

の ASCII コードは、しかしで'4'はありませ452。文字列の代わりに実際の数値が必要な場合はatoi(argv[1])、最初の引数を整数に変換するために使用します。

于 2013-06-01T10:06:17.943 に答える
0

の型に注意してください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
 }
于 2013-06-01T10:16:04.000 に答える
0

コマンドライン引数で何かを渡すと、それらはデフォルトで文字ストリームになり、に割り当てられ**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;
}
于 2013-06-01T10:20:48.873 に答える