如何解析整数命令行参数使用C?(How to parse integer command line

2019-06-27 07:41发布

我想用户通过其中两个参数或留空。 例如:

./program 50 50

要么

./program

当我试图用int main(int argc, char *argv[])我做的第一件事就是改变char *argv[]int *argv[]但没有奏效。 我要的是从用户仅仅是0和100之间输入两个整数 。 所以,如果不是两个整数,那么它应该给出一个错误。

我有点想供出与类型错误(为我所用的C#程序),但无论我进,ARGV [1]是“符”类型的所有时间。

所以我做了什么是

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);
    }

这并不正常工作。 此外,它提供了编译时警告,但如果我改变argvatoi(argv[1])的情况下,那么它给了分段故障(核心转储)错误。

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

编辑:

所以我固定atoi()为什么它被赋予段错误的原因是因为我是用空值尝试它,当我有没有参数。 所以我固定它通过增加一个额外COND。 但现在的问题是,如果该值让我们说

./program asd asd

然后输出atoi(argv[1])将是0。有一种方法来改变这个值?

Answer 1:

不要使用atoi()和不使用strtol() atoi()没有错误检查(因为你发现了!),并strtol()必须是错误检查使用全局errno变量,这意味着你必须设置errno为0,然后调用strtol()然后检查errno再次错误。 更好的方法是使用sscanf()它也可以让你从一个字符串,而不仅仅是一个整数分析任何原始类型,它可以让你读看中格式(如十六进制)。

例如,解析从字符串整数“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");
}

从字符串分析大量的无符号十六进制整数“0x332561”

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

如果您需要更多的错误处理比,使用正则表达式库。



Answer 2:

这将做到:

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;
}


Answer 3:

这些参数也始终以字符串形式传递的,你不能改变的原型main() 操作系统和周边机器总是传递字符串,并不能弄清楚,你已经改变了它。

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



Answer 4:

要检查是否

  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
}


Answer 5:

你这样做了傻傻的事情是错误的C.不管你有什么,采取的字符串或字符作为参数,并再后来,你可以做任何你与他们喜欢的。 要么改变他们使用整数strtol或让它们是串并检查所述串的每一字符的范围内48 to 57因为这些的十进制值char 0 to 9 。 就个人而言,这不是一个好主意,没有这么好的编码习惯。 更好地将其转换并检查你想要的整数范围。



Answer 6:

仍然可以使用的atoi,只是检查参数是否是一个数第一;)
顺便说一句脂肪酶会告诉你转到是 邪恶的但他们通常是由非理智洗脑 “后藤是坏”,“ 后藤是邪恶的”,“ 后藤是魔鬼” 这只是抛出了没有在互联网上阐述的陈述。
是的,spaggethi代码不太易于管理。 和Goto在这方面是一个时代,它取代功能...

    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;
    }


Answer 7:

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

的atoi()有它的缺点。 同样是与strtol()或strtoul将()函数实现。 这些函数将返回一个0值,如果输入到该函数为非数值即,用户进入ASDF或大于一个有效的数字的任何其他。 为了克服这一点,你需要传递给atoi()并调用之前解析字符串ISDIGIT()上的每一个字符,以确保用户已输入一个有效的数字。 之后,你可以使用的atoi()转换为整数。



Answer 8:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
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<argc;i++)
    {
       int n;
       n=atoi(args[i]);
       printf("\nN=%d",n);
       sum += n;
    }
    printf("\nThe sum of given numbers are %d",sum);
    return(0);

  }

检查此程序我增加另一个库文件stdlib.h和这样我就可以使用函数atoi字符数组转换为字符串。



文章来源: How to parse integer command line arguments in C?