使用递归而不使用特定分隔符来反转字符串

时间:2015-07-12 02:04:15

标签: c++ recursion

我有一项任务,要求“从文本文件中一次递归读取一个字符,直到遇到分隔符” -
然后以相反的顺序显示那些非分隔符,最后一个字符显示为大写

假设文件位于行下方,分隔符为!,空格等等。

abc! ndtv

预期输出为:

Cba! Vtdn 

我已经编写了下面的代码并且我得到了预期的输出 - 但是有一个条件是我应该只使用两个变量来完成它,而且我不能用少于3个来完成它。任何指针如何实现它只有2个变量?

int Reverse(ifstream &inFile, int level)
{
   int myInput;
   static int returnValue;
   static int levelofinterest;

   myInput = inFile.get();

   if (!(isspace(myInput)  || ((char)myInput == '.') ||
         ((char)myInput == '!')   || ((char)myInput == ',') ||
         ((char)myInput == '?')   || ((char)myInput == ';') ||
         ((char)myInput == ':')   || ((char)myInput == '\0')||
         myInput == EOF))
   {
       level++;
       Reverse(inFile,level);
   }
   else
   {
       levelofinterest = level;
       returnValue = myInput;
   }

   if(!(isspace(myInput)  || ((char)myInput == '.') ||
         ((char)myInput == '!')   || ((char)myInput == ',') ||
         ((char)myInput == '?')   || ((char)myInput == ';') ||
         ((char)myInput == ':')   || ((char)myInput == '\0')||
         myInput == EOF))
   {
       level--;
       if ((levelofinterest - 1) == level)
       {
           cout << (char)toupper(myInput);
       }
       else
       {
           cout.put((char)myInput);
       }
   }

   return returnValue;
}

1 个答案:

答案 0 :(得分:1)

此代码几乎符合您的要求(但我对它并不完全满意)。除了函数的参数之外,它只有一个额外的变量。但是,我更改了函数签名 - 代码不使用返回值,因此函数被定义为返回void。它可能可以修改,以满足您的替代调用约定和您(转录)注释中概述的循环结构。

#include <iostream>
#include <cctype>

using namespace std;

static void Reverse(istream &inFile, int level)
{
    int c = inFile.get();
    if (c == EOF)
        return;
    if (isalpha(c))
    {
        Reverse(inFile, level + 1);
        if (level == 0)
            cout << (char)toupper(c);
        else
            cout << (char)c;
    }
    else if (level > 0)
        inFile.unget();
    else
        cout << (char)c;
}

int main()
{
    while (cin)
        Reverse(cin, 0);
    return 0;
}

我调用源代码recrevstr.cpp并使用以下命令编译程序(使用make):

g++ -O3 -g -std=c++11 -Wall -Wextra -Werror recrevstr.cpp -o recrevstr

然后运行它:

$ ./recrevstr <<< 'abc! ndtv'
cbA! vtdN
$

需要各种捷径。特别是,所有非字母字符都是分隔符。它使用istream而不是ifstreammain()配置为处理标准输入(aka cin)。与示例代码一样,它依赖于调用代码中的循环来确保作业完成。我从0级开始;相反,从1级开始是微不足道的。

请注意,使用cout<<运算符生成输出的任何代码本质上都是C ++,不能直接应用于C.通过使用<cstdio>和{{1}可以抵消此效果}(和FILE *),加上适当的I / O函数,然后可以使它成为双语,尽管需要条件编译才能使stdin命名空间不受影响。