Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как освободить строку 
:(
    Опции темы
Ekate
Дата 14.8.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.7.2007

Репутация: нет
Всего: нет



Добрый день,
вопрос следующий,
есть функция sub, которая вычитает из 1 аргумента 2ой и записывает рез-т в строку, 
вопрос в том, как корректно очистить строку, чтобы применить функцию в цикле?
Код
Код

     char buf2[200]="";
     char buf3[200]="";
     printf("13 - 2 resBUF2=%s, buf2=%s\n",sub("13","2",buf2),buf2);
     strcpy(buf2,"");  //clearing the string
     printf("BUF2=%s\n", buf2);
     printf("11 - 2 resBUF2=%s, buf2=%s\n",sub("11","2",buf2),buf2);
     printf("11 - 2 resBUF3=%s, buf3=%s\n",sub("11","2",buf3),buf3);


Результат
Код

13 - 2 resBUF2=11, buf2=11
BUF2=
11 - 2 resBUF2=91, buf2=91   //second 1 appeared from previous 11 
11 - 2 resBUF3=9, buf3=9


Спасибо
PM MAIL   Вверх
Ockonal
Дата 14.8.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



А выделять память под строку?
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Ekate
Дата 14.8.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.7.2007

Репутация: нет
Всего: нет



Т.е. так ?

Код

 buf = (char*)malloc(100);
 memset( buf, '\0', 100 );

 while(strcmp(sub(first,second,buf),"null")!=0){
      printf("first=%s, second=%s, buf=%s\n",first,second,buf);
      strcpy(first,buf);
      free(buf);
      buf = (char*)malloc(100);
      memset( buf, '\0', 100 );
      printf("buf=%s\n",buf);
     
     }
free(buf);

PM MAIL   Вверх
Ockonal
Дата 14.8.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Если уж так очищать:
memset( &string, 0, sizeof( string ) );
А вообще, через new/delete.
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Ekate
Дата 14.8.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.7.2007

Репутация: нет
Всего: нет



Цитата

memset( &string, 0, sizeof( string ) );


Нет, так не пойдет:

#include <string.h>

void *memset(void *s, int c, size_t n);

 
DESCRIPTION
The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.  

Ну все равно спасибо за наводку, просто я, наверное, не поняла, вроде изначально при char buf3[200]=""; уже выделяется память, и странно, что когда  strcpy(buf2,"");  не затирается вся строка, но при выводе пустая, я вот этого не поняла 

я не указала, что в С
PM MAIL   Вверх
bsa
Дата 14.8.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ekate, подозреваю, что у тебя есть еще ошибки. Так как в представленном тобой коде видится только одна потенциальная ошибка. Я не знаю, как реализована функция sub, но, думаю, что она либо изменяет строку в треьем параметре, либо выделяет память под новую, либо держит в себе локальный буфер. В любом из этих трех случаев у тебя ошибки:
1. функция printf выведет один и тот же результат
2. не освобождается выделенная память
3. нельзя возвращать указатель на локальные нестатические переменные.

Я что-то забыл?
PM   Вверх
mes
Дата 14.8.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Ekate @  14.8.2008,  10:08 Найти цитируемый пост)
11 - 2 resBUF2=91, buf2=91   //second 1 appeared from previous 11 

при формировании строки (в sub) заканчивай ее \0, тогда хвост не будет отображаться   smile 



--------------------
PM MAIL WWW   Вверх
Ekate
Дата 26.8.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.7.2007

Репутация: нет
Всего: нет



Доброе утро,
не приступала к решению проблемы дооолгое время,
все еще актуальна, не могу понять, наверняка ошибка в процедуре вычитания, но не вижу, не подскажите
Код

/*
  Subtracts from first parameter second and returns result,
  if minuend is less than subtrahend then null string is returned
  (we're dealing with natural numbers)
  param1: first string minuend
  param2: second string subtrahend
  param3: res string where result is returned
*/
char* sub(char *first,char *second,char res[]){
  int f,s,i,d,j,l,max;
  f=strlen(first);
  s=strlen(second);
  if(f>s)max=f; else max=s;
  char *str;
  char *str2;
  char *str3;
  str = (char*)malloc(max+1);  //memoy allocation 
  memset( str, '\0', max+1 );
  str2 = (char*)malloc(max+1);
  memset( str2, '\0', max+1 );
  str3 = (char*)malloc(max+1);
  memset( str3, '\0', max+1);
  int c=0;
  if(isSecondGreater(first,second)==1)//check if 2nd number greater than 1st
    {
      // fprintf(stderr,"The second number should be less than first one,\n we are dealing with natural numbers\n");
      strcpy(res,"null");
      return res;
    }
  else {
    char st[s+1];
    i=0;
    while(*second!='\0'){
      st[i]='9'+'0' - *second;//complement
      second++;
      i++;
    } 
    st[i]='\0';
    if (f>s){
      d = f - s;
      for(i=0;i<d;i++)
    str[i]='9';// nine's complement, if second number has less digits
      strcat(str,st);
    } else strcpy(str,st);

    Addition(str,"1",str2);//get ten's complement
    Addition(first,str2,str3);

    char *sto;// for intermediate result
    sto=(char*)malloc(l);
    memset(sto,'\0',l);

    if (str3[0]=='1'){
      for(i=1;i<strlen(str3);i++) 
    sto[i-1]=str3[i];//removing 1
      j=0;
      for(i=0;i<strlen(sto);i++){   //cleaning zeroes
    if (sto[i]>'0'){
      j=i;
      break;
    }
      }

      int k=strlen(sto);
      int g;
      for(g=0;g<strlen(sto);g++){
    if(sto[g]=='0') c++;  
      }
      if(k==c){// if answer is 0
    res[0]='0';
    res[1]='\0';
      }
      else {
    for(i=j;i<strlen(sto);i++){
      if(sto[i]>='0' && sto[i]<='9')
        res[i-j]=sto[i];
      else break;
    }
    res[i+1]='\0';
      }
    }
    free(sto);
    free(str);
    free(str2);
    free(str3);
    return res;
  }
}


процедура деления
Код

/*
  Divides first number to the second
  if divisor is 0 or greater then divident, then -1 returned
  param1: first string divident
  param2: second string divisor
  return: res
  
*/
char* division2(char *first, char *second, char res[]){
  int f,s,pom,max;
  pom=0;
  f=strlen(first);
  s=strlen(second);
  if(f>s)max=f;else max=s;
  char *sm;
  sm=(char*)malloc(max+1);
  memset(sm,'\0',max+1);
  char *buf;
  //buf = (char*)malloc(f);
  buf = malloc(sizeof(char)*f);
  memset( buf, '\0',sizeof(char)*f);
  strcpy(sm,"0");
  if(atoi(second)==0){
    fprintf(stderr,"The division by 0 is not possible\n");
    strcpy(res,"-1");
    return res;
  }
  if(atoi(second)==1){
    strcpy(res,first);
    return res;
  }
  if(atoi(first)==0) return "0";
 
  if (isSecondGreater(first,second)== 1){
    fprintf(stderr,"The first number should be greater then second,\n we are dealing with natural numbers\n");
    strcpy(res,"-1");
    return res;
  }
  else{
   
      while(strcmp(sub(first,second,buf),"null")!= 0){ // repeatedly sub to get the answer
      // printf("first before = %s", first);
        strcpy(first,buf);
    //printf("first after = %s", first);
    //printf("buf=%s ",buf);
    //free(buf);
    //buf = (char*)malloc(f);

     memset(buf,'\0',sizeof(char)*f);
     Addition(sm,"1",sm);
    //printf("sum=%s\n",sm);
       pom++;
      }

   
      sm[pom]='\0';
      free(buf);
      strcpy(res,sm);
      free(sm);    
      return res;

}


Спасибо
PM MAIL   Вверх
Ekate
Дата 26.8.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.7.2007

Репутация: нет
Всего: нет



поправила вычитание, работает прекрасно, а вот с делением все не получается
Код

char* sub(char *first,char *second,char res[]){
  int f,s,i,d,j,l,max;
  f=strlen(first);
  s=strlen(second);
  if(f>s)max=f; else max=s;
  char *str;
  char *str2;
  char *str3;
  str = (char*)malloc(max+1);  //memoy allocation 
  memset( str, '\0', max+1 );
  str2 = (char*)malloc(max+1);
  memset( str2, '\0', max+1 );
  str3 = (char*)malloc(max+1);
  memset( str3, '\0', max+1);
  int c=0;
  if(isSecondGreater(first,second)==1)//check if 2nd number greater than 1st
    {
      // fprintf(stderr,"The second number should be less than first one,\n we are dealing with natural numbers\n");
      strcpy(res,"null");
      return res;
    }
  else {
    char st[s+1];
    i=0;
    while(*second!='\0'){
      st[i]='9'+'0' - *second;//complement
      second++;
      i++;
    } 
    st[i]='\0';
    if (f>s){
      d = f - s;
      for(i=0;i<d;i++)
    str[i]='9';// nine's complement, if second number has less digits
      strcat(str,st);
    } else strcpy(str,st);

    Addition(str,"1",str2);//get ten's complement
    Addition(first,str2,str3);
    l=strlen(str3);
    char *sto;// for intermediate result
    sto=(char*)malloc(l);
    memset(sto,'\0',l);

    if (str3[0]=='1'){
      for(i=1;i<strlen(str3);i++) 
    sto[i-1]=str3[i];//removing 1
      j=0;
      for(i=0;i<strlen(sto);i++){   //cleaning zeroes
    if (sto[i]>'0'){
      j=i;
      break;
    }
      }

      int k=strlen(sto);
      int g;
      for(g=0;g<strlen(sto);g++){
    if(sto[g]=='0') c++;  
      }
      if(k==c){// if answer is 0
    res[0]='0';
    res[1]='\0';
      }
      else {
    for(i=j;i<strlen(sto);i++){
      if(sto[i]>='0' && sto[i]<='9')
        res[i-j]=sto[i];
      else break;
    }
    res[i+1]='\0';
      }
    }
    free(sto);
    free(str);
    free(str2);
    free(str3);
    return res;
  }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.