Прежде всего, в C строки хранятся как байтовые (char) массивы и должны быть выделены. В этой ситуации строка, используемая для чтения файла, должна быть выделена для символов MAX_LENGTH + 1 (+1 для ограничителя строки, \ 0):
char* string = malloc( (MAX_LENGTH+1) * sizeof(char) );
Это выделит достаточно памяти для строки максимальной длины: MAX_LENGTH.
Другая проблема заключается в том, что массив указателей char **picks
не выделен для хранения 18 строк, которые вы ожидаете прочитать:
Он должен быть выделен для 15 указателей на символы (char *), которые также должны быть размещены в первом цикле.
int main( int argc,char *argv[] )
{
...
char* string = malloc( (MAX_LENGTH+1) * sizeof(char) );
char** picks = malloc(15*sizeof(char *));
FILE* pick_file = fopen( argv[l], "r" );
int num_picks;
for( num_picks=0 ; fgets( string, MAX_LENGTH, pick_file ) != NULL ; num_picks++ )
{
printf("pick a/an %s ", string );
//--- allocate the char array to store the current string
picks[num_picks] = malloc (15 * sizeof(char));
sscanf(string, "%s", picks[num_picks] );
}
for(int x=0; x<num_picks;x++)
printf("%s\n", picks[x]);
}
Вы также должны проверить возвращаемое значение malloc (), и вы можете проверить, действительно ли содержимое файла соответствует ожидаемому и не содержит больше строк или строк длиннее 15 символов.
Также scanf () читает стандартный ввод, я заменил его на sscanf () и добавил пропущенный знак «%» во второй printf ().