如何摆脱这个for循环:`for(; cin>> A;);`

时间:2015-05-08 18:34:25

标签: c++ loops for-loop break

for (cout << "\nEnter the Sentence now:";
    cin >> Ascii;

cout << "The ascii value of each letter you entered, added to the offset factor is: " 
     << (int)Ascii + RandomNumberSubtract << endl);

2 个答案:

答案 0 :(得分:2)

可能最好的建议是不要聪明。你不仅难以让其他任何人*阅读,理解和修改你的代码,而且你冒着超越自己的风险。

因此,不要试图做一些奇怪而聪明的事情来实现你的循环。只是自然地做事。如果他们自然不符合forwhiledo ... while语句的结构,那么只需编写一个通用循环并使用break处理离开循环的陈述。 e.g。

while (true) {
    // Some stuff
    if (i_should_break_out_of_the_loop) {
        break;
    }
    // Some more stuff
}

这几乎总是比你用你的方式折磨for语句更好。

一旦你有一个清晰,易于理解的循环,它应该相对容易修改它以满足你的需要。 (或者提出更清晰,更集中的问题)

*:“其他任何人”在你有足够时间留下短期记忆之后的三个星期内也会包括你。

答案 1 :(得分:0)

我强烈建议您将此循环转换为while循环。但是,无论你是否这样做,都是如此:

只需输入EOF,循环就会终止。

如何输入EOF取决于您的操作系统(也可能取决于您的终端设置)。在Linux上(在默认终端设置下),您会在行的开头按 Ctrl + D 进行EOF。在Windows上,我认为它是 Ctrl + Z 。在Mac上我不知道。

当然你也可以重定向stdin让你的程序来自一个文件(在这种情况下,EOF是 - 正如你猜测的那样 - 在文件末尾生成),或者来自管道(在这种情况下,EOF生成为写作程序关闭管道后立即开始。

如果变量Ascii不是char或string类型,您也可以输入一些无法解析为该变量数据类型的内容(例如,如果读取int,其他任何其他内容比一个数字会导致流报告失败,从而循环终止)。

您还可能希望在循环体中添加另一个结束条件,然后(在for循环中当前只是一个空语句)。例如,您可能决定百分号应该终止循环;然后你可以写(我仍然假设Ascii的类型你没有提供char):

cout << "\nEnter the Sentence now:";
while(cin >> Ascii)
{
   cout << "The ascii value of each letter you entered, added to the offset factor is: " 
        << (int)Ascii + RandomNumberSubtract << endl);
   if (Ascii == '%')
     break;
}

但请注意,通常operator<<会跳过空格;我想你不想跳过空格。因此,您可能不应该operator<<使用get;这也允许你使用行尾作为结束条件:

cout << "\nEnter the Sentence now:";
while(std::cin.get(Ascii) && Ascii != '\n')
{
   cout << "The ascii value of each letter you entered, added to the offset factor is: " 
        << (int)Ascii + RandomNumberSubtract << endl);
}

然而,在这种情况下,最好一步读取该行,然后迭代它:

cout << "\nEnter the Sentence now:";
std::string line;
std::getline(std::cin, line);
for (std::string::iterator it = line.begin; it != line.end(); ++it)
{
  cout << "The ascii value of each letter you entered, added to the offset factor is: " 
        << (int)*it + RandomNumberSubtract << endl;
}

请注意,在C ++ 11中,您可以将其简化为

cout << "\nEnter the Sentence now:";
std::string line;
std::getline(std::cin, line);
for (auto ch: line)
{
  cout << "The ascii value of each letter you entered, added to the offset factor is: " 
        << (int)ch + RandomNumberSubtract << endl;
}