Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > получаю лишние символы


Автор: Ekate 29.6.2008, 13:28
Добрый день, появился такой вопрос. Реализую сложение столбиком в С, код следующий:
Код


char* Addition (char *first, char *second,char str[]){
  int f,s,max,i,rem,prom,x1,x2;
  f=s=i=rem=max=0;  
  x1=x2=1;
  while(*first!='\0'){
    first++;
    f++;
  }  
   first--;  //move pointer to the last charatcetr of the string 
   while(*second!='\0'){
    second++;
    s++;
  }
  second--; //move pointer to the last caharcter of the string
  if(f>s)max=f;
  else max=s;
 
  char buffer[max+1];//buffer storage for result
   for(i=0;i<max;i++){  //addition
    if (i==f)x1=0;
    if (i==s)x2=0;
    prom = x1*(*first-'0')+x2*(*second-'0')+rem;
    if (prom >= 10){
      rem=1;
      prom-=10;
    }else rem=0;
    if(x1!=0)first--;
    if(x2!=0)second--;
     buffer[max-i]=prom+'0';
  }
    buffer[max+1]='\0';

 if(rem==1){ 
    str[0]='1';
    strcat(str,buffer);
  }else
    strcpy(str,buffer);
  return str;
}

int  main(int argc, char *argv[]){
 char str[]="";
 printf("%s\n",Addition(argv[1],argv[3],str));
  return 0;
}



в результате получаю лишние символы, например, если аргументы 999 и 1, то между 1 и 000 лишние символы, не подскажете что я упускаю?
Спасибо 

Автор: IKM2007 29.6.2008, 13:54
Какой компилятор используешь. Вообще не должно компилироватся. У тебя там написано
Код

 if(f>s)max=f;
  else max=s;
 
  char buffer[max+1];

так не должно работать, должен написать
Код

char *buffer;
  buffer=new char[max+1];

так как max не константа.

Автор: Ekate 29.6.2008, 14:39
MinGW, хмм, но ведь max имеет потом определенное целочисленное значение, почему я не могу задать массив фиксированной длины ?

Автор: IKM2007 29.6.2008, 16:11
Если это в C, не знаю, но в C++ если написано 
Код

char a[n]; 

то массив создается во время компиляции, то есть n должен быть константным, а если написано
Код

char *a;
cin>>n;
a=new char [n];
-------------------
delete [] a;

то массив создается во время выполнения программы.

Автор: ama_kid 29.6.2008, 17:27
Ekate, ошибка-то в принципе в том, что ты некорректно работаешь с указателями на строки, но твой вариант заломало переделывать (там было куча всякого наверчено), поэтому я накидал на основе твоего варианта немного по-другому, оптимизируй уж сам:
Код
#include <stdio.h>
#include <strings.h>

char* Addition (char *first, char *second,char str[]){
  int f,s,max,i,rem,prom;
  f = strlen(first);
  s = strlen(second);
  max = (f>s?f:s);
  char buffer[max+1];//buffer storage for result
  for (i=0;i<max;i++) buffer[i]=' ';
  buffer[max+1]='\0';

  while(*first) first++; first--;
  while(*second) second++; second--;
  i = 0;
  rem = 0;
  prom = 0;
  do
  {
     prom = rem;
     if (i<f)
        {
            prom+=(*first-'0');
            first--;
        }
     if (i<s)
        {
            prom+=(*second-'0');
            second--;
        }
    if (prom >= 10){
      rem=1;
      prom-=10;
    }else rem=0;
    buffer[max-i]=prom+'0';
    i++;
 }while(i<max);
 if(rem==1){
    str[0]='1';
    strcat(str,buffer);
  }else
    strcpy(str,buffer);

  return str;
}
int  main(int argc, char *argv[]){
 char str[]="";
 printf("%s\n",Addition(argv[1],argv[3],str));
 return 0;
}

Автор: bsa 29.6.2008, 17:49
Цитата(IKM2007 @ 29.6.2008,  13:54)
Какой компилятор используешь. Вообще не должно компилироватся. У тебя там написано
Код

 if(f>s)max=f;
  else max=s;
 
  char buffer[max+1];

так не должно работать, должен написать
Код

char *buffer;
  buffer=new char[max+1];

так как max не константа.

В стандарте C99 разрешается создание статических массивов с заранее неизвестным количеством элементов.

Автор: Ekate 29.6.2008, 19:13
ama_kid, спасибо за пример, да, действительно мной было много наворочено, но это не решило проблемы, я все равно получаю не 1000 (если задать параметры 1 и 000), а 1, посторонние символы, 000.
Цитата

ошибка-то в принципе в том, что ты некорректно работаешь с указателями на строки

Еще хотела бы спросить где я некорректно использую указатели, чтобы потом не наступать на грабли

Автор: bsa 29.6.2008, 19:26
Ekate, я нашел у тебя две ошибки:
Код
 if(rem==1){ 
    str[0]='1';
    strcat(str,buffer);
  }else
    strcpy(str,buffer);
перед тем, как ты выполнишь операцию str[0]='1' строка str содержит первым символом '\0' - конец строки. Когда ты его заменяешь на '1' ты тем самым убираешь этот символ и все функции (в т.ч. и strcat) начинают искать этот символ дальше и, в большинстве случаев, находят его на некотором расстоянии, это и обуславливает "мусор". лучше замени str[0]='1'; на strcpy(str, "1"); так проще всего.
вторая ошибка находится здесь:
Код
 char str[]="";
 printf("%s\n",Addition(argv[1],argv[3],str));
char str[]= ""; выделяет память только под 1 символ!. Чтобы было больше, сделай так: char str[100] = "";

Автор: Ekate 29.6.2008, 19:39
bsa, спасибо большое , теперь понятно   smile 
Всем спасибо за участие, проблема решена.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)