【问题标题】:Segmentation fault in program using command line arguments使用命令行参数的程序中的分段错误
【发布时间】:2016-06-12 00:20:39
【问题描述】:

我正在尝试编写一个程序来查找 10 个数字中的最大和最小。

要使用我的程序,你必须使用命令行参数 -l 然后 numbers 来确定最大的数字,同样的命令 -s 用于最小的数字。

但是,当我根本不输入命令而只是尝试运行程序时,我会收到分段错误。不知道我哪里出错了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
    int i;
    int min,max,num;
    char *argv1 = argv[1];
    char *small = "-s";
    char *large = "-l";
    min=max=0;
    if (0==strcmp(argv1, small))
    {

        for (i=2; i<argc; i++)
        {
            num=atoi(argv[i]);
            if(i==2)
            {
                min=num;
            }
            else
            {
                if(min>num)min=num;
            }
        }
    printf("The smallest number is %d\n",min);
    }
    else if (0==strcmp(argv1, large))
    {

        for (i=2; i<argc; i++)
    {
        num=atoi(argv[i]);
        if(i==2)
        {
            max=num;
        }
        else
        {
            if(max<num)max=num;
        }
    }
    printf("The largest number is %d\n",max);
    }
    else
    {
        printf("Invalid option");
    }
return 0;
}

【问题讨论】:

    标签: c


    【解决方案1】:

    您在设置char *argv1 = argv[1]; 之前没有先检查argc 以查看传递了多少参数。当您稍后执行if (0==strcmp(argv1, small)) 时,这将导致段错误,因为argv1 没有像您期望的那样指向字符串。

    要修复它,只需在开始将 argv1 与任何内容进行比较之前检查 argc

        if (argc == 1)
        {
            printf("Error: -s or -l required\n");
            exit(1);
        }
    

    【讨论】:

      【解决方案2】:

      在访问参数之前检查参数的数量。

      int main(int argc, char* argv[])
      {
          int i;
          int min,max,num;
          char *argv1 = argv[1];
          char *small = "-s";
          char *large = "-l";
          /* add from here */
          if(argc < 2)
          {
              fprintf(stderr, "Usage: %s command numbers...\n", argc > 0 ? argv[0] : "");
              return 1;
          }
          /* add until here */
          min=max=0;
      

      【讨论】:

      • 非常感谢!我希望有一种方法可以回报你。你一直在帮助我,我真的很感激。
      • @JohnSearcher:请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受最多对您提出的任何问题都有帮助的答案(这也可以稍微提升您的声誉)。请查看About 页面以及How do I ask questions here?What do I do when someone answers my question?
      猜你喜欢
      • 2020-09-16
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2020-11-19
      相关资源
      最近更新 更多