我有一项任务,要求“从文本文件中一次递归读取一个字符,直到遇到分隔符” -
然后以相反的顺序显示那些非分隔符,最后一个字符显示为大写
假设文件位于行下方,分隔符为!,空格等等。
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;
}
答案 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
而不是ifstream
,main()
配置为处理标准输入(aka cin
)。与示例代码一样,它依赖于调用代码中的循环来确保作业完成。我从0级开始;相反,从1级开始是微不足道的。
请注意,使用cout
和<<
运算符生成输出的任何代码本质上都是C ++,不能直接应用于C.通过使用<cstdio>
和{{1}可以抵消此效果}(和FILE *
),加上适当的I / O函数,然后可以使它成为双语,尽管需要条件编译才能使stdin
命名空间不受影响。