休息的替代方法?
Alternative to break?
我对 c++ 很陌生,我被告知不要使用"break"语句。我很好奇"休息"有哪些替代方案?(使用下面的代码示例)
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;
}
}
}
在我看来,使用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);
}
您必须了解如何实现我在伪代码中使用的辅助函数/方法,它们可以轻松实现而不会中断。如果使用帮助程序函数解决问题,则还可以获得比当前使用复杂控制流语句的意大利面条代码更好的解决方案。许多错误可以很容易地隐藏在这样的代码中。
提示: 您的帮助程序函数将在循环中搜索注释文本的末尾,但您可以简单地使用return
退出带有结果的帮助程序函数,而不是break
。
你可以重写循环
for (int i=0;
i < line.length() &&
!(i+1 < line.length() && (line.at(i) == '/') && (line.at(i + 1) == '/'));
++i)
{
fileOut << line[i];
}
fileOut<<endl;
打破有时是必要的 - 没有休息,你可能会撞到前面的东西并伤害自己。
你也可能因为思考不善,然后以一种神秘的方式解决问题而伤害自己,即使你在 6 个月后也不会理解。
最后——谁告诉你不要使用"休息时间"......给他一个休息时间——永远不要停下来向他/她/它寻求建议。
顺便说一句 - 处理你的缩进和卷曲 - 不好。
你可以 -而且应该 - 重写该循环。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];
}
else
与这两个if
陈述中的哪一个相匹配?你是否立即完全确定你是对的?
可以肯定的是,编译器不需要缩进,也毫不在乎它。但是你这样做了,你很快就会发现,随着你的代码变得越来越复杂,除非它被正确缩进,否则它将无法理解。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法