我对c ++很陌生,而且我被告知不要使用'休息'声明。我很好奇有什么替代方法可以解决这个问题。'? (使用下面的代码示例)
void remove_comments( ifstream& fileIn , ofstream& fileOut)
{
string line;
bool flag = false;
bool found = false;
while (! fileIn.eof() )
{
getline(fileIn, line);
if (line.find("/*") < line.length() )
flag = true;
if (! flag)
{
for (int i=0; i < line.length(); i++)
{
if(i<line.length())
if ((line.at(i) == '/') && (line.at(i + 1) == '/'))
break;
else
fileOut << line[i];
}
fileOut<<endl;
}
if(flag)
{
if(line.find("*/") < line.length() )
flag = false;
}
}
}
答案 0 :(得分:3)
在我看来,使用break
是相当不错的,但如果你的任务是在没有它的情况下完成工作,那么让它在没有它的情况下做到这一点。使用来自C ++的不同控制流语句的几个不同结构的代码片段可以解决同样的问题。没有break
也可以解决此问题。我建议你将你的功能分解为一个中心函数和几个辅助函数。因为我不想解决问题,而不是你,我只需要指示和一些“伪代码” - 一些东西。
您有一个输入文本,轮流包含注释和非注释部分。您想在循环中执行以下操作:
// I refer to non-commented text as "writable"
writable_begin = 0
while (writable_begin < text_len)
{
writable_end, comment_type = find_next_comment_begin(writable_begin);
write_out_text(writable_begin, writable_end);
if (comment_type == singleline)
writable_begin = find_singleline_comment_end(writable_end);
else
writable_begin = find_multiline_comment_end(writable_end);
}
您必须了解如何实现我在伪代码中使用的辅助函数/方法,它们可以轻松实现而不会中断。如果使用辅助函数解决问题,那么使用复杂控制流语句的当前意大利面条代码也可以获得更好看的解决方案。许多错误很容易隐藏在这样的代码中。
提示:您的帮助函数将在循环中搜索注释文本的末尾,而不是break
,您只需使用return
退出带有结果的辅助函数。
答案 1 :(得分:2)
你可以重写循环
for (int i=0;
i < line.length() &&
!(i+1 < line.length() && (line.at(i) == '/') && (line.at(i + 1) == '/'));
++i)
{
fileOut << line[i];
}
fileOut<<endl;
答案 2 :(得分:1)
有时候需要打破 - 没有休息,你可能会撞到前面的东西并伤害自己。
你可能也会因为思考得很糟糕,然后以一种神秘的方式解决问题,甚至在6个月后你也不会理解,这也会伤害到你自己。
最后 - 谁告诉你不要使用“休息”......给他一个休息时间 - 永远不要停止他/她/它的建议。
顺便说一句 - 处理你的缩进和曲线 - 不好。
答案 3 :(得分:0)
你可以 - 而且应该 - 重写那个循环。 Mankarse显示了一个选项,但是for
循环中存在所有那些奇怪且难以理解的条件。
您应该学会利用标准库的强大功能。例如,此代码将从line
中存储的字符串中删除C ++样式行注释后面的所有字符:
// Find the first instance of two forward slashes in the line
// and return an iterator to that.
auto begin_comment = line.find("//");
// We found it! Remove all characters from that point on
if (begin_comment != std::string::npos)
line.erase (begin_comment, line.end());
fileOut << line << std::endl;
考虑一下如何将这些代码放在一小块代码中并将它们放入函数中,您将调用它们代表您工作。这不仅可以使代码更具可读性,而且还可以让您养成设计界面的习惯,这是一项非常重要的技能。
作为旁注,你的缩进非常糟糕,你必须努力。看看这个宝石:
for (int i=0; i < line.length(); i++)
{
if(i<line.length())
if ((line.at(i) == '/') && (line.at(i + 1) == '/'))
break;
else
fileOut << line[i];
}
if
与else
两个{{1}}语句中的哪一个匹配?您立即并且完全确定您是对的吗?
可以肯定的是,编译器不需要缩进,也不用关心它。但是你这样做了,你很快就会发现,随着你的代码变得越来越复杂,除非它被正确缩进,否则将无法理解。