Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C Выделение памяти динамическому массиву строк

3.3K
22 ноября 2009 года
eugrita
24 / / 26.02.2006
Задание. Надо выделить из текстового файла слов и создать 1-мерн массив
Данная программа валится (видимо по нехватке памяти)
исправление оператора ниже на 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();
}
297
23 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Не понял, зачем здесь
 
Код:
n=0; f=fopen(fln,"r");
if ( f==NULL)
{printf("Fail ne obnarugen");return;};
f=fopen(fln,"r"); c='0';
два раза открывается файл?


Также бросилось в глаза:
 
Код:
FILE * f; char c='0'; int i,n; char wrd[MAXWRD];
...
f=fopen(fln,"r"); c='0';
Нет нужды повторно присваивать то же значение.


Следующее замечание:
 
Код:
while(c != EOF)
{
    c = fgetc(f);
    if (c==EOF)
    break;
    ...
}
Вместо такой конструкции разумнее использовать
 
Код:
while ( (c = fgetc(f)) != EOF)
{
    ...
}


ЗЫ: и выделяйте код тегами [noparse]
 
Код:
 
[/noparse]
3.3K
23 ноября 2009 года
eugrita
24 / / 26.02.2006
согласен со всеми недочетами, но вроде это некритично.
а меня интересует ответ на поставленный вопрос.
Кроме того, как расценивать данную прогу на соответствие заданию? Ведь по заданию нужен 1-мерный массив строк. А строки хранить где?
297
23 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Критическая ошибка в этом месте:
 
Код:
ST= (char**) malloc((n+1)*sizeof(char));

Нужно:
 
Код:
ST= (char**) malloc((n+1)*sizeof(char[highlight]*[/highlight]));

Хотя вполне достаточно n, а не n+1.
Цитата: eugrita
Кроме того, как расценивать данную прогу на соответствие заданию? Ведь по заданию нужен 1-мерный массив строк. А строки хранить где?


В данном случае это и есть одномерный массив, т. к. обращение к нему производится по одному индексу: ST

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог