Adding Two Values – Solutions

This month’s Exercise is rather simple, though it doesn’t promise a simple solution. Instead, I offer three solutions. One of which is obvious and two are kind of out there. They all work, which is the point.

My first solution is the first one I thought of, the “easy” solution. It uses scanf() to read in two values, one after the other, separated by whitespace.

2024_06-Exercise-a.c

#include <stdio.h>

int main()
{
    int a,b;

    printf("Enter two values: ");
    scanf("%d %d",&a,&b);
    printf("%d + %d = %d\n",a,b,a+b);

    return 0;
}

Remember that scanf() is a stream function. It tries to match its input string with standard input, so it looks for two values separated by a space. Here’s a sample run:

Enter two values: 5 6
5 + 6 = 11

For my second example, I decided to read the command line for values:

2024_06-Exercise-b.c

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

int main(int argc, char *argv[])
{
    int a,b;

    if( argc<3 )
    {
        puts("Enter two values");
        exit(1);
    }

    a = strtol(argv[1],NULL,10);
    b = strtol(argv[2],NULL,10);
    printf("%d + %d = %d\n",a,b,a+b);

    return 0;
}

The if test confirms that three arguments are present on the command line: the program name followed by two items that the code reads as values. When the arguments aren’t present, a message is output, which serves as the program’s prompt. (The program name could also be something like InputTwoValues.)

The strtol() function converts text from a string into a long int value in the given base. The first argument is the string, where I use command line arguments argv[1] and then argv[2]. The second argument is NULL, which directs strtol() to stop looking for additional values. The final argument is the number base, 10 for decimal. Here are my sample runs:

$ ./a.out
Enter two values
$ ./a.out 100 60
100 + 60 = 160

My final example exploits the second argument in the strtol() function. When this value is non-NULL, it’s used as an address to hold a reference to the invalid character after the first found value. This pointer is used to continue scanning the same string for additional values:

2024_06-Exercise-c.c

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

int main()
{
    const int size=16;
    char input[size];
    char *next;
    int a,b;

    printf("Enter two values: ");
    fgets(input,size,stdin);
    a = strtol(input,&next,10);
    b = strtol(next,NULL,10);
    printf("%d + %d = %d\n",a,b,a+b);

    return 0;
}

The second argument to strtol() is a pointer-pointer. Declaring it as char **next doesn’t work, mostly because the variable must be used directly in the second strtol() call.

In the code, next is declared as a pointer, but it’s used in the strtol() call with the & (address-of) operator to be a pointer-pointer. This code generates on warnings or errors in clang. Here is a sample run:

Enter two values: 100 -20
100 + -20 = 80

I’m certain other solutions are available as well. These demonstrate the many possible ways to code such a problem, specifically to obtain user input for the calculation. I hope your solution(s) met with success.

Leave a Reply