1

私はCでこのコードを持っています:

int x = 52706108;

 if(argc >= 2){
  int val = *argv[1];
  int xor = x^val;
  printf("The xor value between %d and %d is %d in decimal\n",x,val,xor);
 }

私は次のようにコンパイルしています:

gcc -m32 -g -o a5_1 a5_1.c

次のように実行します。

./a5_1 12

そして、これは私の出力です:

The xor value between 52706108 and 49 is 52706061 in decimal

パラメータ「12」を渡す理由がわかりませんが、マシンは代わりに 49 を読み取っています。

4

1 に答える 1

7

これは、文字列引数49の ASCII コード ポイントです。これは、 がポインタの配列であり、それぞれが引数を含む C 文字列を指すためです。つまり、あたかも と定義したかのようです。112argvchar argv[1]{'1', '2', '\0')

引数を整数に変換する場合は、次のようにします。

int num = atoi (argv[1]);

または、できればエラーチェックを使用し、数値が範囲外の場合に未定義の動作を回避します。

char *nextChar;
long num = strtol (argv[1], &nextChar, 10);
if ((nextChar == argv[1]) || (*nextChar != '\0')) {
    // Is either empty or has invalid characters.
    return -1;
}

// String was non-empty and all-numeric.

完全な例:

#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
    long x = 52706108;
    if (argc >= 2) {
        char *nextChar;
        long val = strtol (argv[1], &nextChar, 10);
        if ((nextChar == argv[1]) || (*nextChar != '\0')) {
            printf ("Invalid input '%s'\n", argv[1]);
            return -1;
        }
        long xor = x^val;
        printf("Xor between %ld and %ld is %ld in decimal\n",x,val,xor);
    }
    return 0;
}

そのプログラムの出力 (12引数として指定された場合) は次のとおりです。

Xor between 52706108 and 12 is 52706096 in decimal
于 2012-10-23T05:05:20.327 に答える