Произвольная конкретная целочисленная программа на языке си

#c #string #calculator #unsigned-integer

#c #строка #калькулятор #целое число без знака

Вопрос:

Итак, недавно я задал вопрос о произвольной конкретной программе целочисленного калькулятора. Он сканирует две строки и должен вычислять их сумму и разность, умножение, деление и модуль. Пока я думаю, что я действительно близок к завершению функций разности сумм и умножения. Вот как выглядит мой код для функции сложения:

 void sum(char* a, char* b)
{
    //initializing values
    int len1,len2,i;
    int carry=0;
    char *r;
    // counting the digits
    len1=strlen(a);
    len2=strlen(b);
    // checking which array is longer
    if (len1>=len2)
    {
        // if first array is longer we allocate enough memory for the result
        r=(char*)malloc((len1 1)*sizeof(char));
        // starting from the LSB
        for (i=0; i<=len2;   i)
            {   // mod 10 to extract only the last digit of the sum
                // that becomes our new digit
            *(r len1-i)=(*(a len1-i)   *(b len2-i)   carry)%10;
            carry=(*(a len1-i) *(b len2-i))/10;
            }
            // copying the rest of the digits
        for (i=len2 1; i<=len1;   i)
            *(r len1-i)=*(a len1-i);

    }
    //case when the other number has more digits
    else
    {
         r=(char*)malloc((len2 1)*sizeof(char));
        for (i=0; i<=len1;   i)
            {
            *(r len2-i)=(*(a len1-i) *(b len2-i) carry)%10;
            carry=(*(a len1-i) *(b len2-i))/10;
            }
        for (i=len1 1; i<=len2;   i)
            *(r len2-i)=*(b len2-i);
    }
    // printing the result
    printf("The result is: n %s n", r);
}
 

Проблема в том, что когда я пытаюсь вызвать функцию в main, конечный результат просто выдает ошибки, хотя при компиляции кода ошибок нет. Это может быть проблемой в main, так что вот как выглядит мой main.

 int main()
{
    FILE *fp;
    char *fi=NULL, *se=NULL;
    char o;
    int i=0;
    fp= fopen("/CalculatorHistory.txt", "r ");
    opening();
    fi=(char*)malloc(60*sizeof(char));
    se=(char*)malloc(60*sizeof(char));
    while(i<2)
    {
        first();
        scanf("%s", fi);
        // I am not sure when im saving pointer arrays, if it works like this
        // or i should save it in a for loop
        fprintf(fp, fi);
        oper();
        scanf(" %c", amp;o);
        fprintf(fp, o);
        second();
        scanf("%s", se);
        fprintf(fp, se);
        switch (o)
        {
        case ' ':
            sum(fi, se);
        case  '-':
            sub(fi, se);
        case '*':
            mul(fi, se);
        case '/':
            div(fi, se);
        case '%':
            mod(fi, se);

         }
    }
    return 0;
}
 

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

Комментарии:

1. Не связано, но я вполне убежден, что нотация индексации массива является более чистой и более читаемой, чем арифметика указателей / разыменование.

2. Записывать тело кода добавления дважды — не очень хорошая идея. Вы можете определить более длинные и более короткие строки и настроить указатели в соответствии с одним циклом, который сканирует информацию. Вы могли бы использовать char *lhs, *rhs и установить lhs , чтобы указывать на более длинную строку и rhs указывать на более короткую (или наоборот), а затем выполнять вычисления в терминах этих переменных. Неясно, завершаете ли вы свою результирующую строку нулем.

3. Возможно, вас заинтересуют другие способы решения вашей проблемы, например nongnu.org/bnf

4. или немного более сложное использование flex bison: oreilly.com/library/view/flex-bison/9780596805418/ch01.html … это говорит о том, что оба они используют настольный калькулятор в качестве примера «привет, мир».