2016-11-10 82 views
1

我用一些命令行参数运行我的程序。但是,当我输入10,10,10,并打印出来,它打印出49,49,49,这里是我的代码:从C中的命令行参数打印整数

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

这究竟是为什么?

回答

1

那么,argv是指向字符串的指针数组。所有命令行参数都以字符串的形式传递,并且指向每个命令行参数的指针都由argv[n]保存,其中参数的序列为n+1

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

如果argc值大于零,则字符串由argv[0] 指出,代表程序名称;如果 程序名称在主机环境中不可用,则argv[0][0]应为空字符。如果argc的值是 大于1,则由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()
1

解引用一个字符串(*argv[x])给你一个char(在字符串中的第一个字符的值),在这种情况下,值是ASCII '1':十进制49

您可以将这些字符串(没有提领)使用strtol

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

反正argv[0]是你的程序的名字,你确定那个程序名从1开始?