2012-10-23 21 views
1

我有這樣一段代碼在C:的命令行參數使用C - 12傳遞,機讀49

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。

回答

7

49字符串中的1的ASCII碼點參數12。這是因爲argvchar指針的數組,每個指向包含參數的C字符串。所以,就好像你已經將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 
+0

護理擴大? –

+0

@PatricioJerí,擴展實現:-) – paxdiablo

+1

ARGV的元素是字符指針,而不是整數。在將其用作整數之前,您需要將字符串轉換爲整數。 –