C 内联计算器

C 内联计算器,c,string,C,String,我正在尝试制作一个无穷大计算器(数字大小大于或小于整数),只处理字符串。 我正在做加法,但当我需要向下一个字符报告十时,我会遇到问题:比如9+7=16,我将在当前字符中输入6,在结果字符串的下一个字符中输入1。 这是我的密码: char *add_inf(char *nb1, char *nb2, char *rslt) { if (*nb1 && *nb2) { *rslt = (*nb1 - '0' + *nb2 - '0' > 9 ?

我正在尝试制作一个无穷大计算器(数字大小大于或小于整数),只处理字符串。 我正在做加法,但当我需要向下一个字符报告十时,我会遇到问题:比如9+7=16,我将在当前字符中输入6,在结果字符串的下一个字符中输入1。 这是我的密码:

 char    *add_inf(char *nb1, char *nb2, char *rslt)
{
  if (*nb1 && *nb2)
    {
      *rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
      if (*nb1 - '0' + *nb2 - '0' > 9)
        {
          rslt++;
          *rslt = '1'; //Here i put the next char to '1'
          add_inf(nb1 + 1, nb2 + 1, rslt);
        }
      add_inf(nb1 + 1, nb2 + 1, rslt + 1);
    }
  return (rslt);
}
很抱歉-'0'和+'0'太乱了,我应该在计算之前做一个函数将其细分并添加。 当输入为nb1=“11111111”和nb2=“58856557”时,输出正确:

69967668
但当我输入nb1=“1111 4”和nb2=“588856557”时,输出为:

699676611
将1添加到下一个字符并具有:

69967671
它只是将“1”字符添加到我的结果字符串中。 想法?

您似乎缺少一个“其他”:

我不理解顺序-只有在执行加法时字符串以相反顺序存储时,代码才应该工作。

1。我将向您展示三行等效的代码:
*nb1-'0'+*nb2-'0'时,有一个问题:您将如何使您的函数添加
4
99999
(甚至
99990
)?我已将代码减少到最低限度,以便于理解。我正在管理两个不同长度字符串的添加,如果这是您的问题那么,只需在前面的字符串中添加一个伪
0
。因此,不是添加
“4”
“9999”
而是添加
“04”
“099999”
。这解决了您的问题,额外的领先
1
Hum您可能是正确的顺序,需要尝试!但是我觉得我不需要其他的,因为如果*nb1+*nb2>9我回叫add\u inf也会很好地避免“数组索引超出范围”(例如,可能通过检查和调整数组大小)。@Robin因为在第一个
add\u inf
之后没有
return
,一旦从递归返回,代码将再次调用
add\u inf
。要防止这种情况发生,还必须采取其他措施。
 char    *add_inf(char *nb1, char *nb2, char *rslt)
{
  if (*nb1 && *nb2)
    {
      *rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
      if (*nb1 - '0' + *nb2 - '0' > 9)
        {
          rslt++;
          *rslt = '1'; //Here i put the next char to '1'
          add_inf(nb1 + 1, nb2 + 1, rslt);
        }
      else  // sum is less than 10
          add_inf(nb1 + 1, nb2 + 1, rslt + 1);
    }
  return (rslt);
}
*rslt = (*nb1 - '0' + *nb2 - '0' > 9 ? (*nb1 - '0' + *nb2 - '0') % 10 : *nb1 - '0' + *nb2 - '0') + *rslt - '0' + '0';
*rslt = ((*nb1 - '0' + *nb2 - '0') % 10) + *rslt - '0' + '0';
*rslt += (*nb1 - '0' + *nb2 - '0') % 10;
char *add_inf(char *nb1, char *nb2, char *rslt) {
    if (*nb1 && *nb2) {
        int sum = (*nb1 - '0' + *nb2 - '0' + *rslt - '0');

        *(rslt + 0) = (sum % 10) + '0';
        if (sum / 10)
            *(rslt + 1) = (sum / 10) + '0';

        add_inf(nb1 + 1, nb2 + 1, rslt + 1);
    }

    return rslt;
}

int main() {
    char nb1[]    = "11111114";
    char nb2[]    = "58856557";
    char output[] = "000000000";

    add_inf(nb1, nb2, output);
    printf("%s\n", output);
}
char *add_inf(char *nb1, char *nb2, char *rslt) {
    int len = strlen(nb1);
    int carry = 0;

    for (int i=len - 1; i >= 0; --i) {
        int sum = (nb1[i] - '0' + nb2[i] - '0' + carry);

        rslt[i] = (sum % 10) + '0';
        carry   = (sum / 10);
    }

    return rslt;
}

int main() {
    char nb1[]    = "11111114";
    char nb2[]    = "58856557";
    char output[] = "00000000";

    add_inf(nb1, nb2, output);
    printf("%s\n", output);
}
69967671