【问题标题】:My for loop is executing more times than is expected我的 for 循环执行次数超出预期
【发布时间】:2010-11-24 03:13:55
【问题描述】:

我在我的程序中执行了以下for 循环,但我看不出它的设计与我收到的输出有何关联。

cout << no_of_lines << endl;
for (int count = 0; count < no_of_lines + 1; count ++)
{
    getline(Device, line, '=');
    cout << line << endl;
}

这是输出:

3
DeviceName
GPU
Manufacturer
Intel
GraphicalRam
128MB

这是设备列表文件

DeviceName=GPU
Manufacturer=Intel 
GraphicalRam=128MB

在循环中,no_of_lines 指的是文件中的行数,在本例中为 3。我提供此输出以验证循环每行仅执行一次。谁能告诉我为什么这个循环执行的次数比预期的要多?我猜这是因为我将= 作为分隔符,并且循环在递增之前以某种方式执行了额外的时间,但是为什么它会在最后一行的分隔符上停止,需要我添加 1循环限制?

【问题讨论】:

  • 根据cplusplus.com/reference/iostream/istream/getline,您的代码应为DeviceList.getline(line, 255, '=');。我错过了什么吗?
  • 该输出与代码和输入不匹配。还有一些你没有向我们展示的东西。我们需要一个可编译的示例,当我们运行它时它会显示问题。我敢打赌,当你做这个例子时,你会解决你自己的问题。
  • @Mikhail:不。有一个 std::getline() 接受流、字符串和分隔符,这是你应该(通常)使用的(你的版本要求行更少大于缓冲区大小,如果不是,则很痛苦)请参阅:cplusplus.com/reference/string/getline

标签: c++ loops


【解决方案1】:

这个http://www.cplusplus.com/reference/string/getline/ 是你的朋友。文档说,当 delem 字符传递给 getline 时,它​​会读取到找到 delem char 或到达文件结尾。 '\n' 没有区别对待。一旦找到 delem char,它就会丢弃它并填充 line 直到该点之前读取的任何内容。下次你调用 getline 时,它​​会继续从它离开的地方读取。所以在这种情况下,每个调用都如下所示。

DeviceName
GPU\nManufacturer
Intel\nGraphicalRam
128MB\n
上述字符串中的

'\n' 基本上是换行符。它不是真正的反斜杠,后跟 n(2 个字符)。它只是一个换行符'\ n'。只是为了便于理解,我是这样使用的。

为了清楚起见,这里是完整的代码(编译和测试)。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int no_of_lines = 3;
    string line;
    cout << no_of_lines << endl;
    for (int count = 0; count < no_of_lines + 1; count++)
    {
        getline(cin, line, '=');
        cout << line << endl ;
    }
    return 0;
}

现在我希望你清楚为什么需要调用 getline 4 次。

【讨论】:

  • 是的,现在一切都清楚了。我并没有以编译器看到的方式考虑 '\n',它只是另一个字符。非常感谢。
  • Re“这不是真的\n”,它确实是。我怀疑你想说的是它不是字面上的反斜杠,后跟小写 n,而是一个换行符。干杯,
  • 为避免将来在此类情况下出现混淆,请使用cout &lt;&lt; "(" &lt;&lt; line &lt;&lt; ")" &lt;&lt; endl;自行调试
  • 这是个好主意。我也会尽量避免在凌晨 3:30 这样做:P。非常感谢。
【解决方案2】:

您的循环执行no_of_lines+1 次。

我假设您希望分隔符为“=”。但是,当分隔符为 '=' 时,\n 不是分隔符。因此line 将包含\n(例如,在第二个getline 上)。所以显示的行数不等于循环执行的次数。

【讨论】:

    【解决方案3】:

    当您使用= 作为行分隔符时,\n用作行分隔符。

    所以你得到的字符串包含个换行符。

    当您输出这样的字符串时,它会显示为两行或多行(由于它包含换行符)。

    干杯,

    【讨论】:

      【解决方案4】:

      您希望它计数三次,但您的循环计数 0、1、2、3、4,即 5 次迭代。

      【讨论】:

      • +1 表示对正确且有用的信息进行匿名投票。
      • 不是5,是从0到小于4,所以0,1,2,3 = 4次。
      • @Mikhail:嗯,原来如此。我坐得更正了。 :-) 尽管如此,对于 OP 来说,知道循环执行的次数多于行数还是很有用的。
      猜你喜欢
      • 2019-05-05
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2020-11-29
      相关资源
      最近更新 更多