【问题标题】:Command line arguments in C - Passing 12, machine reading 49C 中的命令行参数 - 传递 12,机器阅读 49
【发布时间】:2012-10-23 13:44:04
【问题描述】:

我在 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。

【问题讨论】:

    标签: c command-line-arguments


    【解决方案1】:

    49string 参数 121 的 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;
    }
    

    该程序的输出(当给定 12 作为参数时)是:

    Xor between 52706108 and 12 is 52706096 in decimal
    

    【讨论】:

    • @PatricioJerí,扩张成功:-)
    • ARGV 的元素是字符指针,而不是整数。在将其用作整数之前,您需要将字符串转换为整数。
    • 你说得对,先生,我错过了 atoi(),谢谢:P
    • atoi 不应该与用户输入一起使用。即使您不打算进行任何明确的错误检查,strtol 仍然“更安全”。
    • @user4815162342:同样不安全。如果您向其传递超出范围的内容,则会导致 未定义的行为。除非输入受到控制,否则永远不要使用它。即使那样为什么不使用strtol
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多