относительно:
string_2[i] = string;
Это всегда копирует (ТОЛЬКО) указатель на string
, поэтому все записи в string_2
указывают на string
, а string
содержит то, что когда-либо читалось последним.
Предложите заменить это утверждение на:
strcpy( string_2[i], string );
относительно:
fputs(*(string_2 + 5), stdout);
, когда будет реализован strcpy()
, тогда вызов fputs()
не будетработа из-за дополнительной де-ссылки. предложить:
fputs( string_2 + 5, stdout );
Опубликованный код содержит значительную утечку памяти. Чтобы исправить это, предложите: замените:
string_2 = (char *)malloc(sizeof(char*)*1000);
на
string_2 = calloc( sizeof( char *), 1000 );
, чтобы все указатели в string_2
содержали NULL, а затем вставьте следующее непосредственно перед оператором return
:
for( int i=0; i<MAX_INPUT_LINES; i++ )
{
free( string_2[i] );
}
free( string_2 );
Примечание: функция: free()
без проблем обрабатывает NULL-параметр.
для надежного кода относительно этого вида оператора:
string_2[i] = (char *)malloc(sizeof(char)*1000);
всегдапроверьте (! = NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно.
Примечание: 1000
- это «магическое» число. Чтобы использовать осмысленное имя, предложите:
#define MAX_INPUT_LINES 1000
Затем используйте имя: MAX_INPUT_LINES
при вызове calloc()
Сделайте подобное имя при выделении места для каждой строки из входного файла.
Код должен прекратить ввод строк, если во входном файле более 1000 строк. предложить заменить:
while (fgets(string, 1000, file_1)!= NULL)
на:
while ( i < MAX_INPUT_LINES && fgets(string, 1000, file_1)!= NULL)