【问题标题】:Printing integers from command line arguments in C从 C 中的命令行参数打印整数
【发布时间】:2017-03-24 04:08:30
【问题描述】:

我正在使用一些命令行参数运行我的程序。但是当我输入 10、10、10 并打印出来时,它会打印出 49、49、49。这是我的代码:

int main(int argc, char *argv[]) {
    int seed = *argv[0];
    int arraySize = *argv[1];
    int maxSize = *argv[2];

为什么会这样??

【问题讨论】:

    标签: c command-line-arguments argv argc


    【解决方案1】:

    好吧,argv 是一个指向字符串的指针数组。所有命令行参数都作为 字符串 传递,指向每个参数的指针由argv[n] 保存,其中参数的序列为n+1

    对于托管环境,引用 C11,第 5.1.2.2.1 章

    如果argc的值大于零,则argv[0]指向的字符串 表示程序名argv[0][0] 应为空字符,如果 程序名称在主机环境中不可用。如果argc 的值为 大于一,argv[1]argv[argc-1] 指向的字符串 表示程序参数。

    所以,显然,对于像这样的执行

    ./123 10 10 10 //123是二进制名称

    • argv[0] 不是第一个“传递给程序的命令行参数”。我是argv[1]
    • *argv[1] 不会返回您作为命令行参数传递的 int 值。

      基本上,*argv[1] 会为您提供该 字符串 的第一个元素的值(即,'1'char 值),很可能是 ASCII 编码值(您的平台使用),ansd 根据ascii table 一个'1' 具有49 的十进制值,你看。

    解决方案:你需要

    • 检查参数的数量 (argc)
    • 循环遍历每个参数字符串argv[1] ~ argv[n-1]argc == n
    • 将每个输入字符串转换为int(对于这种情况,你可以使用strtol()

    【讨论】:

      【解决方案2】:

      取消引用字符串 (*argv[x]) 会得到一个 char(字符串中第一个字符的值),在这种情况下,该值为 ASCII '1':十进制 49

      您可以使用 strtol 转换这些字符串(无需取消引用)

      int arraySize = (int)strtol(argv[1], NULL, 10);
      

      反正argv[0]是你的程序名,你确定程序名是1开头的吗?

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2010-12-23
        • 1970-01-01
        • 2020-01-06
        • 2011-12-05
        • 2016-01-22
        • 1970-01-01
        • 2021-03-12
        • 2020-05-05
        相关资源
        最近更新 更多