Search code examples
cstringfgets

Storing the buffer of fgets in Array


I'm new to C (coming from Java) and naturally that poses some difficulties. I would like to write just a short program that reads in char-Arrays from stdin and stores the individual strings in an array. After reading in the strings I just want to have them printed out, but that's when it gets really confusing for me. Here's my code:

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


int main(){

char **stringarray[2];
char buffer[5];
int i = 0;
while( i < 2 && fgets(buffer, 5, stdin) != NULL){
    char *tmp = buffer;
    stringarray[i] = &tmp;
    i++;
}

for(int i = 0; i < 2; i++){
    printf("%s\n", &stringarray[i]);

}

return 0;
}

The first part does in fact compiles (i.e. the part before the print out). I understand that my stringArray has to be an array of char pointers, because that's what a char array basically is in c. It's a pointer to the first character. At first I just wrote

while( i < 2 && fgets(buffer, 5, stdin) != NULL){
    stringarray[i] = buffer;
    i++;
}

which also compiled, but of course then I have one pointer that points to buffer, which will only save the last string that has been read. What do I have to do that I can store a simple array of strings?


Solution

  • I suggest you change your code as following.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h> /* to use strdup function */
    
    
    int main(){
    
    char *stringarray[2]; /* I don't understand why you use pointer to pointer than pointer, char **stringarray[2]; */
    char buffer[6]; /* I suggest 6 than 5, because string has terminate byte in C */
    int i = 0;
    while( i < 2 && fgets(buffer, 5, stdin) != NULL){
        stringarray[i] = strndup(buffer, 5);
        i++;
    }
    
    for(int i = 0; i < 2; i++){
        printf("%s\n", stringarray[i]); /* changed stringarray */
    
    }
    
    return 0;
    }