Сложение и вычитание в C с использованием fscanf () - PullRequest
0 голосов
/ 14 января 2020

У меня есть текстовый файл длиной n m (это не имеет значения в долгосрочной перспективе). В каждой строке есть последовательность, подобная этой:

1 + 2 + 5 - 3 = 

Я использую функцию fscanf, чтобы перехватить все числа и операторы и вычислить их, и когда оператор '=' обнаружил, он печатает в другой файл , Я пользуюсь al oop. У меня вопрос, как C распознает номер и оператора? Я знаю, что оператор относится к типу %c, а число относится к типу %d, но как моя программа работает правильно и почему она не принимает их, например, 5 как символ:

#include <stdio.h>
#include <stdlib.h>
int main()
{
   FILE *InFile;
   FILE *OutFile;
   int number=0;
   int result=0;
   char operator;
   int foundEqualsOp=0;
   InFile = fopen("dane.txt","r");
   OutFile = fopen("wynik.txt","w");
   while(fscanf(InFile,"%d",&result)!=EOF)
   {
        number = 0;
        foundEqualsOp = 0;
        while(!foundEqualsOP){

            fscanf(InFile,"%c",&operator);
            if(operator == '='){
                foundEqualsOp = 1;
                fprintf(OutFile,"%d\n",result);
            }
            else if(operator == '-'){
                fscanf(InFile,"%d",&number);
                result = result-number;
            }
            else if (operator == '+'){
                fscanf(InFile,"%d",&number);
                result = result + number;
            }
        }
  }
 fclose(InFile);
 fclose(OutFile);
 return 0;
}

1 Ответ

0 голосов
/ 14 января 2020

Предположим, что ваш входной файл содержит следующее, как в вашем примере:

1 + 2 + 5 - 3 = 

Внешний scanf читает с %d. Это берет 1 как целое значение 1 и помещает его в result.

Теперь внутренний scanf работает с %c. Он читает пробел после 1, поэтому ни один из блоков if не вводится, и внутренний l oop запускается снова. Внутренний scanf снова читает с %c и читает символ +. Это приводит к вводу блока if (operator == '+'), где при вызове scanf используется %d. Этот спецификатор формата пропускает пробел после + и читает 2 как целочисленное значение 2 и добавляет его к result.

. Выше снова происходит чтение пробела после 2, +, который следует, и пробел и 5, который следует. И снова для следующего пробела, -, пробела и 3.

После этого scanf во внутреннем l oop читает пробел после 3 и ничего не делает, затем на следующей итерации он читает =, после чего печатает результат и устанавливает флаг для выхода из внутреннего l oop.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...