1
votes

I am trying to make a program which will store the data entered by the user in a text file whose name is provided by the user. Program will terminate when the user enters exit. strcmp function of string.h is used for string comparison and fgets() is used to read data from stdin.

Here is my code.

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

void main()
{
    char file[60];          // will store file name
    printf("Enter file name: ");
    fgets(file, 59, stdin);

    FILE *fp = fopen(file, "a+");   // open file in append mode

    if(fp == NULL){
        printf("File not found !");
        return;
    }

    char data[100];
    printf("Enter some data to add to file(exit to terminate): ");
    fgets(data, 99, stdin);

    int flag = strcmp(data, "exit");

    while(flag != 0){
        fputs(data, fp);

        fgets(data, 59, stdin);
        flag = strcmp(data, "exit");
        printf("%d\n", flag);       // for checking whether string are correctly comapred or not
    }

    printf("Bye");

}

Program does not terminate even if i enter exit. I have also tried concatenating "\n" at the end of string input by user but that also doesn't help. Although, gets() function works fine, but i know it is not preferred to use to I shifted to fgets() but it doesn't work for me.

3
The size you pass to fgets is with the null-terminator. And always check what it returns. - Some programmer dude
I have also tried concatenating "\n" at the end of string input by user ..maybe you need to strip it off. :) - Sourav Ghosh
@SouravGhosh Or add it to the constant string literal instead? - Some programmer dude
@Someprogrammerdude quite possible...but not very elegant... - Sourav Ghosh
Note: minus 1 not needed in char file[60]; fgets(file, 59, stdin), Better to use fgets(file, sizeof file, stdin). - chux - Reinstate Monica

3 Answers

1
votes

fgets reads in a complete "line", i.e. a sequence of characters until (and including!) a new line character. Hence, when a user presses "Enter", the new line will be part of the string read in and a strcmp(data,"exit") will evaluate to "not equal".

So either strip off the new line before comparison, or compare with a string literal including a new line. Since you write the data as is(i.e. including the new lines) to a file, it seems cumbersome to first strip the new line off and add it then in the output manually. So I'd actually suggest the second approach:

fgets(data, 100, stdin);
flag = strcmp(data, "exit\n");
1
votes

Check the man page for fgets(), it reads and stores the newline (caused by pressing ENTER) after the entered input. Thus, the strcmp() fails.

You have to manually strip the input buffer off the newline, before you can compare the input. A simple yet elegant way of doing that would be

 data[strcspn(data, "\n")] = 0;
0
votes

An alternative would be to use strstr if excess characters do not matter (i.e. your program would exit if the user types "exit" or "asdfexitasdf". - both of which contain "exit".)

So

int flag = strstr(data, "exit");
if(flag != NULL)
    //exit the program
else
    //stay in the program