2016-11-20 8 views
0

次の式を処理するだけです。中間の2つのオペランドと1つの演算子で単純な数式を解析します。

9-8

12分の5222

* 445 322

7878 + 7

しかし、私はinpurtとして8+9を入力するとき。 コンソールにのみ表示されます8.000000+ 最後のオペランドを処理していないようです。

Iゲスト私は正しくelse if(isOperator(*endTemp))

このブランチ任意のアイデアがありませんでしたか?または方向?私が開始する前に

static double getUserInputValues() { 
    double values[NUM_OF_USER_INPUT_VALUES]; 
    while (1) { 
     errno = 0; 
     char temp[257]; 
     char operator; 
     fgets(temp, 256, stdin); 
     char *str = strtok(temp, " "); 

     int cnt = 0; 
     while (str != NULL && cnt < NUM_OF_USER_INPUT_VALUES) { 
      char *endTemp; 
      double val = strtod(str, &endTemp); 
      printf("%f", val); 
      if (*endTemp == 0 || *endTemp == '\n') { 
       values[cnt] = val; 
       cnt++; 
       str = strtok(NULL, " "); 
      } else if(isOperator(*endTemp)){ 
       operator = *endTemp; 
       printf("%c", operator); 
       str = strtok(NULL, " "); 
      } 
      else { 
       errno = 1; 
       break; 
      } 
     } 
    } 
    return getReturnValue(values, operator);; 
} 


static bool isOperator(char ch){ 
    switch(ch){ 
     case '+': 
      return 1; 
     case '-': 
      return 1; 
     case '*': 
      return 1; 
     case '/': 
      return 1; 
     default: 
      return 0; 
    } 
} 

答えて

1

、私は非常にあなたが物事のこれらの種類は正確にそれらが存在する理由であるため、デバッガを使用する方法を学ぶことを示唆しています。問題を効果的にデバッグする方法を知っていることは、プログラマーのツールキットに不可欠なツールです。

とにかく、 strtodは、浮動小数点数を文字列から解析し、残りの部分を第2引数で指定されたポインタに解析します。

strtokは文字列をトークンに分割します。 あなたの場合、スペースを使用して区切るので、この入力にスペースがないため、入力 "8 + 9"から得られる最初のトークンは "8 + 9"になります。

strtodを呼び出すと、このトークンから8が解析され、残りの文字列「+9」がendTempに格納されます。

コード内で演算子を抽出するだけで、残りの内容を破棄して次のトークンを取ります。

operator = *endTemp; // endTemp == "+9" at this point 
        // so *endTemp == '+'. 
printf("%c", operator); 
str = strtok(NULL, " "); // discard current token (9 is not handled). 

ご覧のとおり、残りの数字は処理していません。

簡単な修正は、以下のようになります。

operator = *endTemp; // endTemp == "+9" at this point 
        // so *endTemp == '+'. 
printf("%c", operator); 
str = endTemp + 1; // str == "9" now. 
関連する問題