Возникают проблемы с пониманием последних двух циклов while в функции getop - PullRequest
0 голосов
/ 26 сентября 2019

Итак, я понимаю, что такое функция getop и как она работает, не понимая циклов while, которые проверяют целочисленную и дробную часть входных данных и помещают их в массив s.

So i 'мы пытались записать эти циклы while стандартным способом (выражение в скобках, а затем приведенные ниже выражения в скобках).

поэтому вместо цикла while:

while(isdigit(s[++i] = c = getch())){
      ;
}

почему нельзя:

while(isdigit(c = getch())){
      s[++i] = c;
}

Полная функция getop:

int getop(char s[]){
  int i, c;

  while((s[0] = c = getch()) == ' ' || c == '\t'){
    ; //set s[0] to the first non space/tab char
  }
  s[1] = '\0'; //s[1] to \0
  if(isdigit(c) == 0 && c != '.' && c != '-'){
    return c; //if not a digit or . then return(must be a +,-,/,*)
  }
  i = 0;
  if(isdigit(c)){
    while(isdigit(s[++i] = c = getch())){
      ; //integer part
    }
  }
  if(c == '.'){
    while(isdigit(s[++i] = c = getch())){
      ; //fraction part
    }
  }
  s[i] = '\0';
  if(c != EOF){
    ungetch(c);
  }
  return NUMBER;
}

Однако выходные данные не совпадают, последний вход по какой-то причине обрезается при использовании альтернативного цикла while.Таким образом, ввод 123 возвращает 12.

1 Ответ

1 голос
/ 26 сентября 2019
while(isdigit(c = getch())){
    s[++i] = c;
}

Оригинал всегда увеличивается i и присваивается s[++i].Ваша версия пропускает эти два шага, если проверка isdigit() не удалась.Чтобы соответствовать поведению оригинала, вам нужно выполнить одно дополнительное присваивание и приращение после окончания цикла.

while(isdigit(c = getch())){
    s[++i] = c;
}
s[++i] = c;
...