如何将整数作为命令行参数?
Posted
技术标签:
【中文标题】如何将整数作为命令行参数?【英文标题】:how to take integers as command line arguments? 【发布时间】:2011-06-15 08:43:04 【问题描述】:我已阅读 a getopt() example,但它没有显示如何接受整数作为参数选项,例如示例代码中的 cvalue
:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc, char **argv)
int aflag = 0;
int bflag = 0;
char *cvalue = NULL;
int index;
int c;
opterr = 0;
while ((c = getopt (argc, argv, "abc:")) != -1)
switch (c)
case 'a':
aflag = 1;
break;
case 'b':
bflag = 1;
break;
case 'c':
cvalue = optarg;
break;
case '?':
if (optopt == 'c')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
printf ("aflag = %d, bflag = %d, cvalue = %s\n",
aflag, bflag, cvalue);
for (index = optind; index < argc; index++)
printf ("Non-option argument %s\n", argv[index]);
return 0;
如果我以testop -c foo
运行上述代码,cvalue
将是foo
,但如果我想要testop -c 42
怎么办?由于cvalue
是char *
类型,我可以将optarg
转换为(int)
吗?我尝试过不使用getopt()
直接访问argv[whatever]
并将其转换为整数,但在使用%d
打印时总是得到一个很大的负数。我假设我没有正确取消引用 argv[]
或其他什么,不确定...
【问题讨论】:
【参考方案1】:你需要使用atoi()
从字符串转换为整数。
【讨论】:
【参考方案2】:以上所有答案都大致正确(Vikram.exe 得到了解释为什么你必须调用一个库函数的道具,其他人都懒得这么做)。但是,没有人指定要调用的 正确 库函数。不要使用atoi
。不要使用sscanf
。
如果您不想允许负数,请使用 strtol
或其相对的 strtoul
。当输入不是数字时,只有这些函数才能为您提供足够的信息。例如,如果用户键入
./a.out 123cheesesandwich
atoi
和 sscanf
会愉快地返回 123,这几乎肯定不是你想要的。只有strtol
会告诉您(通过endptr
)它只处理了字符串的前几个字符。
(没有strtoi
,但如果需要读取浮点数,有strtod
。)
【讨论】:
【参考方案3】:正如您已经在代码中使用的那样,main
函数的原型是
int main (int argc, char** argv)
作为命令行参数提供的任何参数,它们都作为 char * (或简单的字符串)数组传递给您的“程序”。因此,如果您以 foo.exe 123
的形式调用 prog,foo.exe
的第一个参数将是字符串 123,而不是整数值 123。
如果您尝试将参数转换为整数(如您所说),可能使用类似(int) argv[1]
的东西,您将不会获得第一个参数的整数值,而是第一个 arg 存储在您的地址中的某个内存地址空间。要获取整数值,您必须将字符串值显式转换为整数值。为此,您可以使用atoi
函数。检查THIS 手册页以获取可用于转换的类似功能。
【讨论】:
【参考方案4】:使用atoi
。
cvalue = atoi( optarg );
并将 cvalue 声明为 int
。
【讨论】:
【参考方案5】:atoi()
,这意味着 ascii 到整数是要使用的函数。同样,atof()
可用于获取浮点值。
【讨论】:
【参考方案6】:在这种情况下,我会选择sscanf()
。
【讨论】:
【参考方案7】:不,您不能只是将其转换为整数值。您需要使用 sscanf、atoi、atol 或类似函数对其进行转换。
【讨论】:
以上是关于如何将整数作为命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章