Просмотр полной версии : проблема с созданием строки
#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
И еще - думал что из-за того что NT стоит (там в ошибке что-то про NTVDM), под 98 виндой тоже ошибка, только пишется малость по-другому...
Чета я не понял а где выделяется память под char *s_random
А можно тут поподробнее? Я походу чего-то не знаю:)
#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;
}
так работает, все понял :)
Нет, все равно еще вопросы остались...
Например надо вызвать fillrand 5 раз с k=1000 до 5000.
Как это сделать?
Пробовал просто задать char *s_random = new char[5000]; но так появляются всякие лишние символы в строке.
Чего-то у тебя все не правильно, почитай по поводу выделения памяти поподробнее. Кроме того все строки должны оканчиваться 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;
}
О, ништяк!
Пасиба БОЛЬШОЕ!!!
Почитаю по памяти обязательно:)
Я не могу понять что не так теперь-то. Как в этих вот функциях сортировки память надо распределять? По книжке Подбельского пытался посмотреть, там как-то стремно написано. Мож кто подскажет в инете инфу по этому разделу?
#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;
}
Вообще-то плохая манера выделять память внутри функции, а удалять её за пределами функции. Получается так, что если ты не вызовешь вначале функцию fillrand(), то весь последующий код работать не будет. Функции должны принимать указатель на уже имеющийся массив памяти или выделять её и удалять внутри себя. В твоём примере лучше было бы использовать статический массив или локальный массив внутри функции main().
WinMain, а как можно удалить память внутри функции, ведь потом надо возвратить строку, под которую эта память выделялась.
А насчет статических массивов - это ж прога в универ, там преподы требуют чтоб делали именно так, а сами объяснять ниче не хотят...
В остальных функциях у тебя в качестве пареметра передаётся указатель на строку. Вот и в функцию fillrand() передавай его как параметр. А выделение памяти убери из fillrand() и перенеси в функцию main().
Попробовал так сделать...
char *fillrand(int k,char *s_random)
{
int i;
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
s_random[k] = 0;
return s_random;
}
И main:
main()
{
clrscr();
randomize();
int k=1000;
char *s = new char[k+1];
char *sorted = new char[k+1];
unsigned long sum;
unsigned int runnumb;
s=fillrand(k,s);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
printf("%d %s\n\n%d %s\nReady.\n\n",strlen(s),s,strlen(sorted),sorted);
// fputs(s,f);
// fputs("\n\n",f);
sorted=shakersort(s);
// fputs(sorted,f);
fclose(f);
printf("%d %s\n\n%d %s\nReady.",strlen(s),s,strlen(sorted),sorted);
delete[] sorted;
delete s;
getche();
return 1;
}
Для sorted надо тоже память выделять? Сам-то массив у меня генерируется, а вот с функцией сортировки shakersort что-то не то... Ее когда вызываю, у меня и s и sorted становятся строками из одного символа (сам алгоритм рабочий).
Функция shakersort() возвращает указатель на строку s, поэтому для sorted выделять память не нужно. Да и вообще эта переменная здесь лишняя.
У меня в shakersort() что-то неправильно? Она строку просто обрезает до одного символа, еще в первом цикле
for (j=r;j>l;j--)
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}
Вопрос снят, тока щас дошло что это из-за того что последний символ 0... ))) Щас буду делать еще куча тупых вопросов появится...
Powered by vBulletin® Version 4.0.2 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot