Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получаю лишние символы 
V
    Опции темы
Ekate
Дата 29.6.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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 лишние символы, не подскажете что я упускаю?
Спасибо 
PM MAIL   Вверх
IKM2007
Дата 29.6.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Какой компилятор используешь. Вообще не должно компилироватся. У тебя там написано
Код

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

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

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

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


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Ekate
Дата 29.6.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



MinGW, хмм, но ведь max имеет потом определенное целочисленное значение, почему я не могу задать массив фиксированной длины ?
PM MAIL   Вверх
IKM2007
Дата 29.6.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Если это в C, не знаю, но в C++ если написано 
Код

char a[n]; 

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

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

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


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
ama_kid
Дата 29.6.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

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



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;
}



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
bsa
Дата 29.6.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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 разрешается создание статических массивов с заранее неизвестным количеством элементов.
PM   Вверх
Ekate
Дата 29.6.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

Еще хотела бы спросить где я некорректно использую указатели, чтобы потом не наступать на грабли
PM MAIL   Вверх
bsa
Дата 29.6.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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] = "";
PM   Вверх
Ekate
Дата 29.6.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, спасибо большое , теперь понятно   smile 
Всем спасибо за участие, проблема решена.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




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


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

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