Search code examples
cpointersprintfgetopt

Getopt not grabbing and storing my input in C


This is my first post on this site so please forgive any formatting errors. I am coding a small program to get simple information from a file like amount of words, sorting it etc. However I started simply by using getopt since I want to use the command line to parse my commands. This is what I have so far.

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

int value = 0;

int main(int argc, char **argv) {
    extern char *optarg;
    extern int optind;
    int c, err = 0;
    int cflag = 0, sflag = 0, fflag = 0;
    char *substring;

    // usage from instructions in case of error
    static char usage[] = "usage: mywords [-cs] [-f substring] filename";  

    // only f flag requires additional input
    while ((c = getopt(argc, argv, "csf:")) != -1)
        switch (c) {
            case 'c':
                cflag = 1;
                break;

            case 's':
                sflag = 1;
                break;

            case 'f':
                fflag = 1;
                printf("Before assigning to substring\n");
                substring = optarg;
                printf("After\n");
                break;

            case '?':
                err = 1;
                break;
        }

    if (fflag = 1) {
        printf("%c ", &substring);
    }
}

I will then input something like this to the command line after I run my makefile (which runs successfully with no errors):

    mywords -f test

and ideally the output would be

    test

The printf statements I have in the fflag are simple test prints to see if I was even reaching there. Thank you for your help in advance.

EDIT

It was fixed. David Collins had the right answer. Thank you so much everyone


Solution

  • I have noticed three issues in you code. (There may be other small issues but addressing the following should get you up and running I think.)

    Testing for equality

    You should use if (fflag == 1) instead of if (fflag = 1).

    Pointer de-referencing

    If you want to retrieve the value of the character pointed to by substring, you would use *substring instead of &substring.

    But you probably don't want to do this. See below.

    printf() format specifiers

    When printing a string / character array, use the %s specifier instead of %c. (%c is for single characters). So you should have

    if (fflag == 1) {
        printf("%s ", substring);
    }
    

    Or - more simply - just

    if (fflag) {
        puts(substring)
    }
    

    since any non-zero value evaluates to true in C (and you initialize fflag to zero at the start of your program).