Для начала объявление функции
int read (FILE *library)
не имеет смысла, так как внутри функции параметр перезаписывается, то есть его значение не используется.
И вместо указателятипа char *
функция возвращает объект типа int.
Также неясно, почему вы открываете файл в двоичном режиме вместо текстового режима.
library=fopen("C:\\Users\\pc\\Desktop\\library.txt","rb");
^^^^
Во-вторых, этот оператор возврата
return (int)*(word+j);
не имеет смысла и приводит к утечке памяти, поскольку вся выделенная память, кроме памяти, на которую указывает указатель * (слово + j), не освобождается.
Поэтому перед выходом из функции необходимо освободить выделенную память.
Например,
char *p = *( word + j );
for ( int i = 0; i < n; i++ )
{
if ( i != j ) free( *( word + i ) );
}
free( word );
return p;
Соответственно, функция должна иметь тип возврата char *
.
В основном вы два раза вызываете функцию. И снова не освобождает память, на которую указывает возвращенный указатель.
length_word = strlen (read (library));printf ("% s% d", read (library), length_word)
Также обратите внимание на то, что функция fgets может добавлять символ новой строки '\ n' во входную строку. Вам нужно удалить его.
Это можно сделать следующим образом
for (int i = 0; i < n; i++)
{
*(word+i)=(char *)malloc(256*sizeof(char));
fgets(*(word+i), 256, library);
word[i][ strcspn( word[i], "\n" ) ] = '\0';
}
, если вы используете старый компилятор, который не преобразует escape-символ возврата каретки и escape-символ новой строки водна новая строка, после которой вы можете написать
word[i][ strcspn( word[i], "\r\n" ) ] = '\0';
Таким образом, функция должна быть объявлена как
char * read( void );
внутри функции, которую вы должны объявить
FILE *library;
в функции main вы должны написать
char *word = read();
, а затем
size_t length_word = strlen( word );
printf("%s%zu", word,length_word) ;
free( word );