0

関数 int Reverse(ifstream &inFile, int level) があります。特定のセパレータに到達するまで、一度に 1 文字ずつ読み取ることになっています。次に、関数はそれらの文字を逆の順序で表示します。区切り文字は呼び出し元の関数に返されます。セパレーターは反転しません。

#include <fstream>
#include <cctype>
#include <iostream>

using namespace std;

inline bool checkSeparator(int someValue)
{
   return(isspace(someValue) || someValue == (int)',' || someValue == (int)':' ||     someValue == (int)';' ||
  someValue == (int)'.' || someValue == (int)'?' || someValue == (int)'!' || someValue == EOF);
}

int Reverse(ifstream &inFile, int level)
{
   int input = inFile.get();

   if (!checkSeparator(input))
      Reverse(inFile, ++level);

   --level;

   if (level == 1)
      input = toupper(input);

   if (!checkSeparator(input))
      cout.put(input);

   if (checkSeparator(input))
      return(input);
}

セパレーターを本当に戻せないところまで来ました。すべての制御パスが値を返すわけではないようです。関数が正しい値を返すようにするにはどうすればよいですか? ありがとう。

4

1 に答える 1

2

私が正しければ、リバース関数が最後にセパレーターを返すようにします。問題は、この再帰レベルで読み取られた文字がセパレーターでない場合、最後の if ステートメントが true と評価されないため、Reverse 関数が必ずしも何も返さないことです。セパレータは伝播されません。

これは、別の変数を導入することで修正できます。

int Reverse(ifstream &inFile, int level)
{
   int input = inFile.get();
   int separator = 0;
   if (checkSeparator(input))
       return input;
   else
       separator = Reverse(inFile, ++level);
   ...
   // remove the last if
   return separator;
}
于 2013-07-22T10:06:16.390 に答える