Search code examples
cfgetsstrlen

Finding string length after using fgets()


I am trying to find the length of string 1(s1).. but the value that it is giving is 0, and input for s1 = "HELLO", because of this error not able to execute the for loop where I use length of string 1.

Following is the code...works fine in gcc version 4.9.1 (Ubuntu 4.9.1-16ubuntu6) but not in online compiler( gcc 4.9.2, C99 standard )

/*To check if common characters are present in two strings*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio_ext.h>
#define SIZE 100
int main() {
int m, i, j, t, len1;
char *s1, *s2;
scanf("%d", &t);  //No. test cases
__fpurge(stdin);

for(m = 0; m < t; m++)
{
    int res = 0;

    s1 = (char *)malloc( SIZE * sizeof( char ));
    s2 = (char *)malloc( SIZE * sizeof( char ));

    fgets(s1, SIZE, stdin);
    fgets(s2, SIZE, stdin);

    *(s1 + strlen(s1) - 1) = '\0';
    *(s2 + strlen(s2) - 1) = '\0';

    len1 = strlen(s1); // len1 is storing as 0
    printf("%d", len1 ); 
    for (i = 0; i < strlen(s1); i++)  
    {
        for (j = 0;j < strlen(s2); j++)
        {
            if ( *(s1 + i) == *(s2 + j) )
            res = 1;
        }
    }

if(res == 1)
printf( "YES\n" );
else
printf("NO\n");
}
return 0; 
}

Solution

  • There is a fairly standard way to handle stripping the newline from input following a read from a file with either fgets or getline. There are variations, but all replace the newline with a null-terminating character. Here is an example using your code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define SIZE 64
    
    int main (void) {
    
        char *s1 = NULL;
        char *s2 = NULL;
        size_t len1 = 0;
        size_t len2 = 0;
    
        s1 = malloc (SIZE * sizeof *s1);
        s2 = malloc (SIZE * sizeof *s2);
    
        printf ("\n Enter s1: ");
        fgets (s1, SIZE, stdin);
        printf ("\n Enter s2: ");
        fgets (s2, SIZE, stdin);
    
        /* strip newline or carriage rtn    */
        len1 = strlen (s1);
        while (len1 > 0 && (s1[len1-1] == '\n' || s1[len1-1] == '\r'))
            s1[--len1] = 0;
    
        len2 = strlen (s2);
        while (len2 > 0 && (s2[len2-1] == '\n' || s2[len2-1] == '\r'))
            s2[--len2] = 0;
    
        printf ("\n  len1 : %zu   s1 : %s\n  len2 : %zu   s2 : %s\n\n", len1, s1, len2, s2);
    
        if (s1) free (s1);
        if (s2) free (s2);
    
        return 0;
    }
    

    Output

    $ ./bin/fgets_strip
    
     Enter s1: This is s1
    
     Enter s2: This is s2
    
      len1 : 10   s1 : This is s1
      len2 : 10   s2 : This is s2