вычесть 2 числа, используя массивы символов - PullRequest
0 голосов
/ 15 декабря 2011

Я хотел вычесть два массива символов, которые имеют числовые значения.Я делаю это, потому что я хочу вычесть большие числа.Когда я компилирую эту программу, она не показывает никаких ошибок, но при выполнении она вылетает.Я попытался сделать следующее псевдокод

foreach character(right2left)
    difference=n1[i]-n2[i]//here suppose they are integers
    if(difference<0)
    {
        n1[i-1]--;
        difference+=10;
    }
    result[i]=diff;

Я написал псевдокод для ясности.

 int subtract(char *n1,char *n2,int n1Len,int n2Len){
 int diff;  
    int max=n1Len;
  char* res = (char*)malloc (max+2);
    memset(res, '0', max +1); 

    res[max] = '\0';
    int i=n1Len - 1, j = n2Len - 1, k = max;
    for (; i >= 0 && j >=0; --i, --j, --k) {
    if(i >= 0 && j>=0)
    {
            diff=(n1[i]-'0') - (n2[i]-'0') ;
        if(diff<0)
        {
        int temp=n1[i-1]-'0';
        temp=temp-1;
        n1[i-1]=temp+'0';
        diff+=10;
        }
        res[i]=diff+'0';
   }
  else 
         res[i]=n1[i];

    }
    return atoi(res);
 }


int main(void) {
    int t=subtract("55","38",2,2);
    printf("%d\n", t);
}

Ответы [ 4 ]

2 голосов
/ 15 декабря 2011

Есть несколько видимых ошибок.Надеемся, что они предоставят вам несколько указателей:

  1. Вы передаете строковые литералы в функцию и пытаетесь изменить их в функции.Это недопустимо и, скорее всего, приведет к ошибке сегментации.Вместо int t=subtract("55","38",2,2); Возможно, вы можете попробовать:
    char a[] = "55";
    char b[] = "38";
    int t=subtract(a,b,strlen(a), strlen(b));

  2. max должно быть n1Len+1 для размещениязавершающий символ NUL в массиве res char.Вы можете установить его на 0 вместо '0' при инициализации.res[max] = '\0'; вызывает неопределенное поведение при доступе к связанному элементу, избавиться от него.Поэтому используйте memset(res,0,max) вместо этого.Или используйте calloc вместо malloc + memset, как предложено @ pmg.

  3. Не вводите возвращаемое значение malloc или calloc при кодировании на C

  4. for (; i >= 0 || j >=0; --i, --j, --k) на самом деле должно быть for (; i >= 0 && j >=0; --i, --j, --k), поскольку ни i, ни j не должно быть 0.Вам нужно работать с логикой функции, где i!=j.

  5. diff=n1[i]-'0'+n2[i]-'0' должно быть diff=(n1[i]-'0') - (n2[i]-'0'), так как вы вычитаете и не добавляете цифры

  6. res[i]=diff неверно, поскольку вы устанавливаете целочисленный результат как символьное значение.Измените его на res[i]=diff+'0', чтобы установить значение символа

Надеюсь, это поможет вам начать.
Надеюсь, это поможет!

2 голосов
/ 15 декабря 2011
    char* res = (char*)malloc (max);
    memset(res, '0', max-1);      // set the result to all zeros
    res[max] = '\0';

Допустим, max равно 3.
Вы устанавливаете res[0], а res[1] равным 0. Затем вы устанавливаете несуществующее res[3] в 0.
res[2] все еще неинициализировано.

Вместо этого попробуйте calloc, и не забудьте пробел для ограничителя нулевой строки:)

Кроме того, приведение возвращаемого значения из malloc (или calloc) равно,в лучшем случае, избыточно и может скрывать ошибку, которую компилятор мог бы обнаружить, если бы не было приведения.

    char *res = calloc(max + 1, 1); // allocate and initialize to 0
1 голос
/ 15 декабря 2011

Это

diff=n1[i]-'0'+n2[i]-'0';

должно быть разницей

diff = (n1[i] - '0') - (n2[j] - '0');

(помимо вычитания и не сложения индекс для n2 должен быть j, я думаю)С помощью добавления вы можете получить нецифровые символы в результате, и atoi() останавливается на первом из них, если это самое первое, возвращает 0.

Кроме того, вы должны проверить, что n2действительно не длиннее n1, или вы будете писать вне границ.

0 голосов
/ 12 октября 2012
diff=n1[i]-'0'+n2[i]-'0';

это не дает разницы. Должно быть

diff = (n1[i] - '0') - (n2[j] - '0');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...