n=0; f=fopen(fln,"r");
if ( f==NULL)
{printf("Fail ne obnarugen");return;};
f=fopen(fln,"r"); c='0';
C Выделение памяти динамическому массиву строк
Данная программа валится (видимо по нехватке памяти)
исправление оператора ниже на ST= (char**) malloc((3*n)*sizeof(char));
помогает для некоторых файлов, на других - все равно валится.
Подозреваю, может так нельзя делать: strcpy(ST[n],wrd);
#include <stdio.h>
#include <conio.h>
#define MAXWRD 100
//задание -выделение из текстового файла слов и создание 1-мерного массива
char ** strokRead(char * fln, int *nn)
{//для хранения слов используем динамический массив ST[n][MAXWRD] где n - кол-во слов,
//определяемое после 1-го прохода чтения файла
FILE * f; char c='0'; int i,n; char wrd[MAXWRD];
char **ST; char * q=wrd; int pos;
n=0; f=fopen(fln,"r");
if ( f==NULL)
{printf("Fail ne obnarugen");return;};
f=fopen(fln,"r"); c='0';
while(c != EOF)
{
c = fgetc(f);
if ((c=='.') || (c==',') || (c==':')|| (c==' ') )
n++;
}
fclose(f);
ST= (char**) malloc((n+1)*sizeof(char)); //вроде это выделение памяти для старшего индекса
ST[n]='\0';
for(i=0;i < n;i++)
ST = (char*) malloc(MAXWRD*sizeof(char)); //а это – для младщего индекса
pos=0;strcpy(wrd,""); i=0;
f=fopen(fln,"r"); c='0'; n=0;
while(c != EOF)
{
c = fgetc(f);
if (c==EOF)
break;
if (isalnum(c)) wrd=c;
if ((c=='.') || (c==',') || (c==':')|| (c==' ') ) {
wrd='\0';
strcpy(ST[n],wrd); //может так нельзя обращаться к 2-мерн строк массиву? здесь сбой
n++; strcpy(wrd,""); i=0;
}
else i++;
}
fclose(f); *nn=n;
return ST;
}
void main()
{
int i,N; //n
char **str; FILE * f; int C; char ST[20];
char * p=ST;
str=strokRead("dan.txt",&N);
for(i=0;i<N;i++)
printf("%s ",str);
getch();
}
Код:
Также бросилось в глаза:
Код:
FILE * f; char c='0'; int i,n; char wrd[MAXWRD];
...
f=fopen(fln,"r"); c='0';
...
f=fopen(fln,"r"); c='0';
Следующее замечание:
Код:
while(c != EOF)
{
c = fgetc(f);
if (c==EOF)
break;
...
}
{
c = fgetc(f);
if (c==EOF)
break;
...
}
Код:
while ( (c = fgetc(f)) != EOF)
{
...
}
{
...
}
ЗЫ: и выделяйте код тегами [noparse]
Код:
а меня интересует ответ на поставленный вопрос.
Кроме того, как расценивать данную прогу на соответствие заданию? Ведь по заданию нужен 1-мерный массив строк. А строки хранить где?
Код:
ST= (char**) malloc((n+1)*sizeof(char));
Нужно:
Код:
ST= (char**) malloc((n+1)*sizeof(char[highlight]*[/highlight]));
Хотя вполне достаточно n, а не n+1.
Цитата: eugrita
Кроме того, как расценивать данную прогу на соответствие заданию? Ведь по заданию нужен 1-мерный массив строк. А строки хранить где?
В данном случае это и есть одномерный массив, т. к. обращение к нему производится по одному индексу: ST