Страница 1 из 2
проблема с созданием строки
Добавлено: 29 ноя 2005, 08:21
shpi0
Код: Выделить всё
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#define filename "c:\\temp\\saod.txt"
char *fillrand(int k)
{
char *s_random;
int i;
for (i=0;i<k;i++)
s_random[i]=random(97)+25;
return s_random;
}
main()
{
char *s;
randomize;
s=fillrand(1000);
FILE *f=fopen(filename,"w");
fputs(s,f);
fclose(f);
return 0;
}
Вот смотрите, не получается создать строку произвольных символов. И вообще часто такая ошибка возникает, не понимаю в чем дело.
Скрин ошибки
http://tarko-selo.ru/bc.jpg
P.S. используется Borland C++ ver. 3.1
Добавлено: 29 ноя 2005, 08:25
shpi0
И еще - думал что из-за того что NT стоит (там в ошибке что-то про NTVDM), под 98 виндой тоже ошибка, только пишется малость по-другому...
Добавлено: 29 ноя 2005, 08:38
ssDev
Чета я не понял а где выделяется память под char *s_random
Добавлено: 29 ноя 2005, 08:44
shpi0
А можно тут поподробнее? Я походу чего-то не знаю

Добавлено: 29 ноя 2005, 08:54
shpi0
Код: Выделить всё
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#define filename "c:/temp/saod.txt"
char *fillrand(int k)
{
int i;
char *s_random = new char[1000];
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
return s_random;
}
main()
{
clrscr();
char *s = new char[1000];
randomize;
s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fclose(f);
getche();
return 1;
}
так работает, все понял

Добавлено: 29 ноя 2005, 09:38
shpi0
Нет, все равно еще вопросы остались...
Например надо вызвать fillrand 5 раз с k=1000 до 5000.
Как это сделать?
Пробовал просто задать char *s_random = new char[5000]; но так появляются всякие лишние символы в строке.
Добавлено: 29 ноя 2005, 10:20
Hawk
Чего-то у тебя все не правильно, почитай по поводу выделения памяти поподробнее. Кроме того все строки должны оканчиваться 0 и выделенную памят следует всетаки удалать.
Что-то типа того должно быть.
Код: Выделить всё
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#define filename "c:/temp/saod.txt"
char *fillrand(int k)
{
int i;
char *s_random = new char[k+1]; // Зачем тебе создавать 1000 элементов когда ты точно знаешь сколько тебе надо?
// + 1 для последнего нолика (строка всегда оканчивается на 0!)
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
s_random[k] = 0; // добавили ноль
return s_random;
}
main()
{
clrscr();
char *s; // Тут не надо выделять пямять, т.к. мы выделим её в функции fillrand
randomize();
s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fclose(f);
delete[] s; // НЕ ЗАБЫВАЕМ удалить выделенный кусок
getche();
return 1;
}
Добавлено: 29 ноя 2005, 10:48
shpi0
О, ништяк!
Пасиба БОЛЬШОЕ!!!
Почитаю по памяти обязательно

Добавлено: 30 ноя 2005, 11:21
shpi0
Я не могу понять что не так теперь-то. Как в этих вот функциях сортировки память надо распределять? По книжке Подбельского пытался посмотреть, там как-то стремно написано. Мож кто подскажет в инете инфу по этому разделу?
Код: Выделить всё
#define filename "c:/temp/saod.txt"
char *fillrand(int k)
{
int i;
char *s_random = new char[k+1];
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
s_random[k] = 0;
return s_random;
}
unsigned long checksum(char *s)
{
unsigned long sum=0;
int i,j;
j=strlen(s);
for (i=0;i<j;i++)
sum += s[i];
return sum;
}
unsigned int runnumber(char *s)
{
int i,j;
unsigned int k;
j=strlen(s);
for (i=0;i<j;i++)
if (s[i] > s[i+1])
k++;
return k;
}
char *bubblesort(char *st)
{
int i,j,k;
char buf;
k=strlen(st);
for (i=0;i<k-1;i++)
for (j=k;j>=i+1;j--)
{
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}
}
return st;
}
char *shakersort(char *st)
{
int j,l=1,k=strlen(st),r=strlen(st);
char buf;
do
{
for (j=r;j>l;j--)
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}
l=k;
for (j=l;j<r;j++)
if (st[j]>st[j+1])
{
buf=st[j];
st[j]=st[j+1];
st[j+1]=buf;
k=j;
}
r=k;
}
while (l<r);
return st;
}
main()
{
clrscr();
randomize();
char *s,*sorted;
unsigned long sum;
unsigned int runnumb;
s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fputs("\n\n",f);
sorted=shakersort(s);
fputs(sorted,f);
fclose(f);
delete[] s;
getche();
return 1;
}
Добавлено: 30 ноя 2005, 13:37
WinMain
Вообще-то плохая манера выделять память внутри функции, а удалять её за пределами функции. Получается так, что если ты не вызовешь вначале функцию fillrand(), то весь последующий код работать не будет. Функции должны принимать указатель на уже имеющийся массив памяти или выделять её и удалять внутри себя. В твоём примере лучше было бы использовать статический массив или локальный массив внутри функции main().