从C

时间:2016-11-10 07:48:15

标签: c command-line-arguments argv argc

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

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

为什么会这样?

2 个答案:

答案 0 :(得分:1)

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

对于托管环境,引用n+1,章节§5.1.2.2.1

  

如果C11的值大于零,则argc指向的字符串   表示程序名称; argv[0]如果是,则为空字符   程序名称不能从主机环境中获得。如果argv[0][0]的值是   大于一,argc通过argv[1]指向的字符串   代表程序参数。

显然,对于像

这样的执行
  

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

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

    基本上,int为您提供字符串的第一个元素的值(即*argv[1]的{​​{1}}值),最有可能是ASCII编码值(您平台使用的),根据ascii table {ans} char具有小数va; '1'的lue,您看到了。

解决方案:您需要

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

答案 1 :(得分:1)

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

您可以使用strtol

转换这些字符串(无需取消引用)
int arraySize = (int)strtol(argv[1], NULL, 10);

无论如何argv[0]是你的程序的名称,你确定程序名称以1开头吗?