程序中的分段错误使用命令行参数

时间:2016-02-29 03:26:10

标签: c

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

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

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

要解决此问题,请在开始比较argc之前检查argv1

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