Week 3 Laboratory — Sample Solutions

  1. concat.c

    // concat.c: print all command line arguments in a single line
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
       int i;
    
       printf("Name of the program: %s\n", argv[0]);
       printf("Number of arguments: %d\n", argc-1);
       for (i=1; i<argc; i++) {
          printf("%s", argv[i]);
       }
       putchar('\n');
       return EXIT_SUCCESS;
    }
    

  2. add3.c

    // add3.c: sum exactly 3 arguments from the command line
    #include <stdio.h>
    #include <stdlib.h>
    
    #define NUMARGS 3
    
    int main(int argc, char *argv[]) {
       int dataGood = 1;
       int retval = EXIT_SUCCESS;
       if (argc < 4 || argc > 4) {
          fprintf(stderr, "%s: incorrect number of args\n", argv[0]);
          dataGood = 0;
       } else {
          int sum = 0;
          int i;
          for (i=1; i<=NUMARGS && dataGood; i++) {
             int n;
             if (sscanf(argv[i], "%d", &n) == 1) {
                sum = sum + n;
             } else {
               fprintf(stderr, "%s: found non-numerical arg\n", argv[0]);
               dataGood = 0;
             }
          }
          if (dataGood) {
             printf("%d\n", sum);
          }
       }
       if (!dataGood) {
          retval = EXIT_FAILURE;
       }
       return retval;
    }
    

  3. sumnum.c

    // sumnum.c: sum the numbers on the command line
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
       int dataGood = 1;
       int retval = EXIT_SUCCESS;
       if (argc > 1) {
          int i, n;
          int sum = 0;
          for (i=1; i<argc && dataGood; i++) {
             if (sscanf(argv[i], "%d", &n) == 1) {
                sum = sum + n;
             } else {
                fprintf(stderr, "error: argument %s is non-numeric\n", argv[i]);
                dataGood = 0;
             }
          }
          if (dataGood) {
             printf("%d\n", sum);
          }
       }
       if (!dataGood) {
          retval = EXIT_FAILURE;
       }
       return retval;
    }
    

    Makefile

    CC=gcc
    CFLAGS=-Wall -Werror -O
    
    sumnum: sumnum.c
    	$(CC) $(CFLAGS) -o $@ $<
    
    countplus: countplus.c
    	$(CC) $(CFLAGS) -o $@ $<
    
    all: sumnum countplus
    
    clean:
    	rm -f sumnum.o countplus.o sumnum countplus core
    

  4. countplus.c

    // countplus.c: iteratively count from 0 to argv[1],
    // where argv[1] is a non-negative integer
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
       int retval;
       int endcount = 0;
       if ((argc != 2) || (sscanf(argv[1], "%d", &endcount) != 1)) {
          fprintf(stderr, "Usage: %s number\n", argv[0]);
          retval = EXIT_FAILURE;
       } else {
          int i;
          for (i=0; i<=endcount; i++) {
             printf("%d", i);
             if (i < endcount) {
                putchar(',');
             } else {
                putchar('\n');
             }
          }
          retval = EXIT_SUCCESS;
       }
       return retval;
    }