У вас есть несколько проблем. Во-первых, scanf
не очень хорошо работает с fgets
- он оставит новую строку во входном потоке, что означает, что когда вы вызовете fgets
, он просто прочитает это. Самый простой способ исправить это - использовать fgets
для чтения всей строки при запросе количества студентов и sscanf
для получения действительного числа, например:
char temp[100];
fgets(temp,100,stdin);
sscanf(temp,"%d",&num);
Во-вторых, вы создаете только одну действительно большую длинную строку, а не несколько строк. Итак, чтобы создать num
строк, вы сначала хотите выделить «массив» строк, подобный этому
names=malloc(sizeof(char *)*num);
, а затем использовать цикл для выделения места для строк
for(int i=0; i<num; i++)
{
names[i]=malloc(100);
}
Вы также увидите, что не нужно приводить возвращаемое значение из malloc
, но вам нужно включить правильный файл, а именно "stdlib.h". И технически вам не нужно sizeof(char)
, поскольку это всегда будет 1.
Вы не проверяете возвращаемые значения из fopen
, поэтому не обрабатываете ситуацию, когда не удается открыть файл для записи.
Не уверен, почему вы также открываете файл для чтения в конце, так как вы ничего с ним не делаете, и он просто автоматически закрывается, когда программа заканчивается.
И вы должны всегда иметь привычку писать код для освобождения выделенной памяти, даже если вам не нужно, потому что код такой простой.
Также технически main
должно вернуть int
.
Окончательная версия кода может выглядеть так:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int num;
char temp[100];
printf("enter no of students");
fgets(temp,100,stdin);
sscanf(temp,"%d",&num);
char **names=malloc(num*sizeof(char*));
printf("enter the names");
fp=fopen("file.txt","w");
if(fp==NULL)
{
printf("Failed to open\n");
return 1;
}
for(int i=0;i<num;i++)
{
names[i]=malloc(100);
fgets(names[i],100,stdin);
fprintf(fp,"%s\n",names[i]);
}
fclose(fp);
for(int i=0;i<num;i++)
{
free(names[i]);
}
free(names);
printf("names stored in *ptr");
}