'Problems with fgets function

Here I use fgets() to get user input with several strings, it never appeared in the output:

#include <stdio.h>

int main() {
    char color[20];
    char pluraNoun[20];
    char celebrity[20];

    printf("Enter a color: ");
    scanf("%s", color);
    printf("Enter a plural noun: ");
    scanf("%s", pluraNoun);
    printf("Enter a celebrity: ");

    fgets(celebrity, 20, stdin);

    printf("Roses are %s\n", color);
    printf("%s are blue\n", pluraNoun);
    printf("I love %s\n", celebrity);
    return 0;
}


Solution 1:[1]

Don't mix scanf() and fgets() or as man page says:

It is not advisable to mix calls to input functions from the stdio library with low-level calls to read(2) for the file descriptor associated with the input stream; the results will be undefined and very probably not what you want.

Here is a fgets() version:

#include <stdio.h>
#include <string.h>

#define LEN 20

char *strip(char *s) {
    size_t n = strlen(s);
    if(n && s[n-1] == '\n') s[n-1] = '\0';
    return s;
}

int main() {
    char color[LEN];
    char pluraNoun[LEN];
    char celebrity[LEN];

    printf("Enter a color: ");
    fgets(color, LEN, stdin);

    printf("Enter a plural noun: ");
    fgets(pluraNoun, LEN, stdin);

    printf("Enter a celebrity: ");
    fgets(celebrity, LEN, stdin);

    printf("Roses are %s\n", strip(color));
    printf("%s are blue\n", strip(pluraNoun));
    printf("I love %s\n", strip(celebrity));
    return 0;
}

You want check the return value from fgets() to ensure your program does something sensible on EOF.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1