John Searcher
John Searcher

Reputation: 65

Segmentation fault in program using command line arguments

I'm trying to write a program that finds the largest and smallest of 10 numbers.

To use my program, you must use the command line argument -l then numbers to determine largest number, the same for the command -s for smallest numbers.

However, when I don't enter a command at all, and just try to run the program, I receive a segmentation fault. Not sure where I went wrong.

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

Upvotes: 0

Views: 7850

Answers (2)

mcmathews
mcmathews

Reputation: 48

You're setting char *argv1 = argv[1]; without first checking argc to see how many arguments were passed. This will cause a segfault when you later do if (0==strcmp(argv1, small)) because argv1 isn't pointing at a string like you are expecting it to.

To fix it, just check argc before you start comparing argv1 with anything:

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

Upvotes: 1

MikeCAT
MikeCAT

Reputation: 75062

Check the number of arguments before accessing to arguments.

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;

Upvotes: 3

Related Questions