C中的命令行参数-传递12,机器读取49

C中的命令行参数-传递12,机器读取49,c,command-line-arguments,C,Command Line Arguments,我有一段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 像这样运行它: gcc -m32 -g -o a5_1 a5_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
像这样运行它:

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。

49
是字符串参数
12
1
的ASCII码点。这是因为
argv
是一个
char
指针数组,每个指针指向一个包含参数的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;
}

49
是字符串参数
12
1
的ASCII码点。这是因为
argv
是一个
char
指针数组,每个指针指向一个包含参数的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;
}

@PatricioJerí,扩展实现:-)ARGV的元素是字符指针,而不是整数。在将字符串用作整数之前,您需要将其转换为整数。您是对的,先生,我缺少atoi()为此,谢谢您:P
atoi
不应与用户输入一起使用。即使您不打算进行任何显式错误检查,strtol仍然“更安全”@user4815162342:它同样不安全。如果您传递超出范围的内容,则会导致未定义的行为。除非输入受到控制,否则不应使用它。即使如此,为什么不使用
strtol
?@PatricioJerí,扩展实现:-)ARGV的元素是字符指针,而不是整数。您需要将字符串转换为整数r、 在将其用作整数之前。您是对的,先生,我缺少atoi(),谢谢:P
atoi
不应用于用户输入。即使您不打算进行任何显式错误检查,strtol仍然“更安全”@user4815162342:它同样不安全。如果你传递超出范围的东西,它会导致未定义的行为。除非输入受到控制,否则它永远不应该被使用。即使如此,为什么不使用
strtol