проблема с созданием строки

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

Код: Выделить всё

#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
Даже самое длинное путешествие начинается с первого шага.
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

И еще - думал что из-за того что NT стоит (там в ошибке что-то про NTVDM), под 98 виндой тоже ошибка, только пишется малость по-другому...
Даже самое длинное путешествие начинается с первого шага.
ssDev
Сообщения: 50
Зарегистрирован: 20 янв 2005, 14:41

Чета я не понял а где выделяется память под char *s_random
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

А можно тут поподробнее? Я походу чего-то не знаю :)
Даже самое длинное путешествие начинается с первого шага.
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

Код: Выделить всё

#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;
}
так работает, все понял :)
Даже самое длинное путешествие начинается с первого шага.
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

Нет, все равно еще вопросы остались...
Например надо вызвать fillrand 5 раз с k=1000 до 5000.
Как это сделать?
Пробовал просто задать char *s_random = new char[5000]; но так появляются всякие лишние символы в строке.
Даже самое длинное путешествие начинается с первого шага.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Чего-то у тебя все не правильно, почитай по поводу выделения памяти поподробнее. Кроме того все строки должны оканчиваться 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; 
}
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

О, ништяк!
Пасиба БОЛЬШОЕ!!!
Почитаю по памяти обязательно :)
Даже самое длинное путешествие начинается с первого шага.
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

Я не могу понять что не так теперь-то. Как в этих вот функциях сортировки память надо распределять? По книжке Подбельского пытался посмотреть, там как-то стремно написано. Мож кто подскажет в инете инфу по этому разделу?

Код: Выделить всё

#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;
}
Даже самое длинное путешествие начинается с первого шага.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Вообще-то плохая манера выделять память внутри функции, а удалять её за пределами функции. Получается так, что если ты не вызовешь вначале функцию fillrand(), то весь последующий код работать не будет. Функции должны принимать указатель на уже имеющийся массив памяти или выделять её и удалять внутри себя. В твоём примере лучше было бы использовать статический массив или локальный массив внутри функции main().
Ответить