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



我正在尝试编写一个程序,以查找 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 %dn",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 %dn",max);
    }
    else
    {
        printf("Invalid option");
    }
return 0;
}

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

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;

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

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

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

最新更新