Do not use string word = NULL
. fscanf
will not "put" anything in it because NULL is a defined constant, and it will not give an error. You could end up in an infinite loop (it also will not detect EOF).
Declaring word
as a char array is a fine approach. Remember 45 letters will "fit" in the array declared char word[45]
, but the "%s" directive of fscanf will try to make it a valid string, and will therefore need one more byte for the null terminator.
Another option would be to use the C type char *
and allocate it with malloc
or calloc
.
In the interest of completeness, there is a "more comfortable" approach. You can use the "m" option in the conversion specification, and fscanf
will allocate the memory; it is up to the programmer to free it. Something like this:
string word;
while(fscanf(infile,"%ms",&word) != EOF)
{
// do "word" logic
free(word);
}
From man fscanf
:
An optional 'm' character. This is used with string conversions (%s, %c, %[), and relieves the caller of the need to allocate a corresponding buffer to hold the input: instead, scanf() allocates a buffer of sufficient size, and assigns the address of this buffer to the corresponding pointer argument, which should be a pointer to a char * variable (this variable does not need to be initialized before the call). The caller should subse‐ quently free(3) this buffer when it is no longer required.