问题:
我想知道n和a的区别,都存储在char中
ALI结构中的数组。基本上,我要做的是初始化
两个整数(temp_n和temp_a),当前数字为n和a,
减去它们并将结果放入名为
k.如果a的第j位大于n的第i位,则
我在数字上加10如果n,完成减法,然后在下一个
转,我把温度提高一点。数字a的值肯定会下降
介于1和n-1之间(已经给出)。如果a短于n,则
当我到达a的最后一个数字时,我把n的剩余数字放到
结果数组k.和我都是反向的,所以初始化
我的值应该是n-1的大小。
例子:
我将一个数字存储在这样的结构中:

typedef struct Arbitrary_Large_Integer
{
     char digits[];
} ALI;

要求:
我知道使用char数组比使用
只有一个成员的结构几乎没有意义,但是我
这次被迫在我的代码中添加结构(这是一个要求
为了我的任务)。
代码:
ALI *subtraction(ALI n, ALI a, int nLength, int aLength)
{
    ALI *result;
    result = (ALI*)malloc(nLength * sizeof(ALI));
    if (result == NULL)
    printf("ERROR");

    int temp_n, temp_a, difference;
    int i = nLength - 1; //iterator for number 'n'
    int j = aLength - 1; //iterator for number 'a'
    int k = 0; //iterator for number 'k', n - a = k
    bool carry = false; //to decide whether a carry is needed or not the turn

    for (i; i >= 0; i--)
    {
         //subtracting 48 from n.digits[i], so temp_n gets the actual number
         //and not its ASCII code when the value is passed
         temp_n = n.digits[i] - ASCIICONVERT;
         temp_a = a.digits[j] - ASCIICONVERT;

        //Performing subtraction the same way as it's used on paper
        if (carry) //if there is carry, a needs to be increased by one
       {
              temp_a++;
              carry = false;
        }
              if (temp_n >= temp_a)
              {
                   difference = temp_n - temp_a;
               }
              //I wrote else if instead of else so I can clearly see the condition
             else if (temp_a > temp_n)
            {
                 temp_n += 10;
                 difference = temp_n - temp_a;
                 carry = true;
            }

            //placing the difference in array k, but first converting it back to ASCII
            result->digits[k] = difference + ASCIICONVERT;
            k++;

           //n is certainly longer than a, so after every subtraction is performed on a's digits,
           //I place the remaining digits of n in k
           if (j == 0)
           {
                for (int l = i - 1; l >= 0; l--)
               {
                    result->digits[k] = n.digits[l];
                    k++;
                }

            //don't forget to close the array
            result->digits[k] = '\0';
            break;
          }
          j--;
      }

      //reverse the result array
     _strrev(result->digits);
     return result;
}

输出/错误:
Output results
当数组被传递给函数时,它的值
因为某些原因而改变。我搞不清是怎么回事。

最佳答案

问题:
非标准C
typedef不是有效的标准C结构。挠性阵列成员(FAM).digits除了柔性阵列成员之外,还必须伴随至少一个先前命名的成员。建议将.nLength作为第一个成员。

// Not standard
typedef struct Arbitrary_Large_Integer {
   char digits[];
} ALI;

malloc(0)??
由于代码使用的是非标准C,请注意nLength * sizeof(ALI)可能与nLength * 0相同。
没有空字符的空间
代码试图将.digits用作带_strrev()的字符串,mallloc()至少小了1。
其他问题可能存在。
AMinimal, Complete, and Verifiable example对于其他修复/解决方案很有用

10-08 01:53