2011-12-15 4 views
0

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

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); 
} 
+0

Почему бы вам не использовать класс bignum? –

+1

Что означает 'not run'? Он не компилируется? Он не дает результатов, которые вы хотите? или Он работает, но падает? Пожалуйста, просто не сбрасывайте код на нас и заставляйте нас находить это. Это ваша проблема, поэтому я четко и четко расскажу о вашей проблеме. –

+0

Как? если он продвинут, я не должен его использовать. Этот код для кого-то, кто является таким новичком в C. – Nickool

ответ

2

Существует несколько видимых ошибок. Надеюсь, это даст вам некоторые указатели:

  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 массив символов. Вы можете установить его на 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' установить значение символа

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

+0

Thank you !!!! о вашем номере1 У меня есть еще одна функция добавить, что я строго их называю, и она работает.о номере 5 нет, это не должно быть, потому что, когда я пишу n1 [i] - '0', я имею в виду целочисленное значение n1 и I n2 [i] - '0', которое будет уменьшаться от n1, тогда мы имеем это ' n1-'0 '- (n2-'0') ', который будет тем, что я написал, я попробую ваши другие части. Большое вам спасибо. – Nickool

+0

о, вы правы! Я обратно написал его сейчас, он сработает! ничего не будет показано .appologize – Nickool

+0

@nikparsa: Программа вылетает? –

2
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 
+0

Спасибо, я не знаю, пожалуйста, скажите мне? – Nickool

+0

Мне нравится сайт [POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/) для быстрой ссылки на многие функции, включая [calloc()] (http://pubs.opengroup.org/onlinepubs/ 9699919799/функции/calloc.html). Некоторые из функций (или их использования), описанных там, являются специфичными для POSIX, но они легко идентифицируются, и вы можете избежать их, если хотите написать переносимый C. – pmg

+0

Спасибо, но он все равно возвращает ноль. – Nickool

1

Этот

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

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

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

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

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

+0

да, вы правы! Теперь я исправил, что ничего не покажет, что он сработает на консоли. – Nickool

+0

Vote Up and Thanks – Nickool

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

это не дает difference.It должен быть

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

На самом деле вы все еще передаете строку char, поскольку 'char []' является эквивалентом для символа 'char *' в параметре функции. 'n1Len' и' n2Len' являются необязательными, если он использует обычную строку, потому что они заканчиваются на 0. – Synxis

Смежные вопросы