'why does malloc not taking in the full text? [duplicate]

Why is it when I try to take in a text in the variable is does not store in the full sentence. The malloc seems to not allocate enough memory for the string why ?

so for the 'second' variable, when i put in 'is not happy why' BUT 'second' only stores 'is no' when is should have more than enough space for the string, why ?

when I try the code below :

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

/* Function Declerations */
char *str;
char *second;

/* Global Variables */

int main(){
    /* Initializing Global Variables */

    /* EXPERIMENTING WITH FGETS */
    /* Initial memory allocation */
    str = malloc(5 * sizeof(char));
    second = malloc(200 * sizeof(char));
    /* Get user input and print results */
    printf("Enter a string: "); // ask user to put in a string
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1] = '\0'; // Removes new line character of fgets
    printf("Enter a another string: "); // ask ujason is a godser to put in a string
    fgets(second, sizeof(second), stdin);
    second[strlen(second) - 1] = '\0'; // Removes new line character of fgets
    printf("String = %s, Address of String is = %p\n", str, str);
    printf("String = %s, Address of String is = %p\n\n\n", second, second);

    
    /* Reallocating memory */
    str = (char *)realloc(str, (100 * sizeof(char)));
    printf("Combine text\n");
    strcat(str, second);
    printf("String = %s, Address of String is = %p\n", str, str);
    printf("String = %s, Address of String is = %p\n\n\n", second, second);

    free(str);
    free(second);
    return 0;
}

/* Function Details */

the output is:

Enter a string: jason
Enter a another string:  is not happy why
String = jason, Address of String is = 00000000001C2460
String =  is no, Address of String is = 00000000001C5FD0


Combine text
String = jason is no, Address of String is = 00000000001C70B0
String =  is no, Address of String is = 00000000001C5FD0


Solution 1:[1]

Okay so when you call the fgets, you pass the size of the pointer. Not the size of wathever it points to.

So, for example, now it's working:

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

/* Function Declerations */
char *str;
char *second;

/* Global Variables */

int main(){
    /* Initializing Global Variables */

    /* EXPERIMENTING WITH FGETS */
    /* Initial memory allocation */
    str = (char*) malloc(7 * sizeof(char));
    second =  (char*) malloc(200 * sizeof(char));
    /* Get user input and print results */
    printf("Enter a string: "); // ask user to put in a string
    fgets(str, 7, stdin);
    str[strlen(str)] = '\0'; // Removes new line character of fgets
    printf("Enter a another string: "); // ask ujason is a godser to put in a string
    fgets(second, 200, stdin);
    second[strlen(second)] = '\0'; // Removes new line character of fgets
    printf("\nString = %s, Address of String is = %p\n", str, str);
    printf("String = %s, Address of String is = %p\n\n\n", second, second);

    
    /* Reallocating memory */
    str = (char *)realloc(str, (100 * sizeof(char)));
    printf("Combine text\n");
    strcat(str, second);
    printf("String = %s, Address of String is = %p\n", str, str);
    printf("String = %s, Address of String is = %p\n\n\n", second, second);

    free(str);
    free(second);
    return 0;
}

You need to pass to fgets the actual size not the size of the pointer :)

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 al366io