如何在C中解析整数命令行参数?

我希望用户传递两个参数或将其留空。 例如:

./program 50 50 

要么

 ./program 

当我尝试使用int main(int argc, char *argv[]) ,我做的第一件事就是将char *argv[]更改为int *argv[]但它不起作用。 我想要的是用户只需输入0到100之间的两个整数 。 因此,如果它不是两个整数,那么它应该给出一个错误。

我有点想用类型给出错误(就像我以前用C#编程的那样),但无论我输入什么,argv [1]都会一直是’char’类型。

所以我所做的就是

 for (int i = 0; i <= 100; i++) { //printf("%d", i); if (argv[1] == i) { argcheck++; printf("1st one %d\n", i); } else if (argv[2] == i) { argcheck++; printf("2nd one %d\n", i); } 

这不起作用。 此外,它在编译时会发出警告,但如果我用atoi(argv[1])更改argv ,则会出现Segmentation fault(core dumped)错误。

我需要一种简单的方法来解决这个问题。

编辑:

所以我用atoi()修复了,之所以给出分段错误,是因为我在没有参数的情况下尝试使用null值。 所以我通过添加额外的cond来修复它。 但现在问题是,如果价值是让我们说的话

 ./program asd asd 

那么atoi(argv[1])的输出就是0.有没有办法改变这个值?

不要使用atoi()并且不要使用strtol()atoi()没有错误检查(正如你发现的那样!)和strtol()必须使用全局errno变量进行错误检查,这意味着你必须将errno为0,然后调用strtol() ,然后再次检查errno为了错误。 更好的方法是使用sscanf() ,它还允许您从字符串中解析任何基本类型,而不仅仅是整数,并且它允许您读取花哨的格式(如hex)。

例如,要从字符串解析整数“1435”:

 if (sscanf (argv[1], "%i", &intvar) != 1) { fprintf(stderr, "error - not an integer"); } 

从字符串中解析单个字符“Z”

 if (sscanf (argv[1], "%c", &charvar)!=1) { fprintf(stderr, "error - not a char"); } 

从字符串解析浮点“3.1459”

 if (sscanf (argv[1], "%f", &floatvar)!=1) { fprintf(stderr, "error - not a float"); } 

从字符串解析大的无符号hex整数“0x332561”

 if (sscanf (argv[1], "%xu", &uintvar)!=1) { fprintf(stderr, "error - not a hex integer"); } 

如果您需要更多error handling,请使用正则表达式库。

这样做:

 int main(int argc, char*argv[]) { long a,b; if (argc > 2) { a = strtol(argv[1], NULL, 0); b = strtol(argv[2], NULL, 0); printf("%ld %ld", a,b); } return 0; } 

参数总是作为字符串传递,你不能改变main()的原型。 操作系统和周围的机器总是传递字符串,并且无法确定您是否已经更改了它。

您需要使用例如strtol()将字符串转换为整数。

你想检查是否

  1. 收到0或2个参数
  2. 收到的两个值介于0和100之间
  3. 收到的参数不是字符串。 如果字符串来sscanf将返回0。

以下逻辑将帮助您

 int main(int argc, char *argv[]) { int no1 = 0, no2 = 0, ret = 0; if ((argc != 0) && (argc != 2)) { return 0; } if (2 == argc) { ret = sscanf(argv[1], "%d", &no1); if (ret != 1)return 0; ret = sscanf(argv[2], "%d", &no2); if (ret != 1)return 0; if ((no1 < 0) || (no1 >100)) return 0; if ((no2 < 0) || (no2 >100)) return 0; } //now do your stuff } 

你无辜地做的事情在C中是错误的。无论如何,你必须把字符串或字符作为你的论据,然后你可以用它们做任何你喜欢的事情。 使用strtol将它们更改为整数或让它们成为字符串并检查字符串中每个字符串的范围是48 to 57因为它们是char 0 to 9的十进制值。 就个人而言,这不是一个好主意,也不是那么好的编码实践。 更好地转换它们并检查所需的整数范围。

仍然可以使用atoi ,只需检查参数是否为数字;)
btw ppl会告诉你goto是 邪恶的但是他们通常被不明智的 “goto is bad”“goto is evil”“goto is the devil” 语句 洗脑, 这些 语句在没有详细说明的情况下被抛弃。
是的,spaggethi代码不太可管理。 并且在那个环境中转到它取代function的时代……

  int r, n, I; for (I = 0; I < argc; ++I) { n = 0; do if ( !((argv + I) [n] >= '0' && (argv + I) [n] <= '9') ) { err: fprintf(stderr,"ONLY INTEGERS 0-100 ALLOWED AS ARGUMENTS!\n"); return 1; } while ((argv + I) [++n] != '\0') r = atoi(argv[I]); if (r > 100) goto err; } 

你不能改变main()函数的参数。 所以你应该使用atoi()函数将参数从字符串转换为整数。

atoi()有其缺点。 对于strtol()或strtoul()函数也是如此。 如果函数的输入是非数字的,则这些函数将返回0值,即用户输入asdf或除有效数字以外的任何值。 要解决这个问题,您需要先解析字符串,然后再将其传递给atoi()并在每个字符上调用isdigit()以确保用户输入了有效数字。 之后,您可以使用atoi()转换为整数。

 #include #include #include main(int argc,char *args[]) { int i,sum=0; for(i=0;i<=argc;i++) { printf("\n The %d argument is: %s",i,args[i]); } printf("\nTHe sum of given argumnets are:"); for(i=1;i 

检查这个程序我添加了另一个库stdlib.h,所以我可以使用函数atoi将字符数组转换为字符串。