程序正在打印意外的空行

时间:2015-12-13 08:40:31

标签: c++

考虑以下代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
   int n = 1;
   string data[13];
   while(n > 0){
      cin >> n;
      for(int i = 0; i < n; i++){
         getline(cin,data[i]);
         cout << data[i] << endl;
      }
   }
}

我在我的android上用cppdroid编译了这个。我想在数组中保存n行。 (n <= 13)。一切都很好。但是当我在程序的第一行输入一个整数时,它会打印一个空行,而在第三行,程序会输入行的输入。我的控制台窗口如下所示:

2

This is line 1.
This is line 1.
And this is line 2.
And this is line 2.

我想删除不需要的空格。

3 个答案:

答案 0 :(得分:4)

cin >> n;

仅消耗您输入的数字,并在输入缓冲区中留下换行符(至少)。

然后由第一个执行的

读取并输出该换行符
getline(cin,data[i]);
cout << data[i] << endl;

为避免这种情况,您也可以使用字符串的getline作为整数输入,例如通过stoi转换为整数。或者,不太健壮,您可以在流上调用ignore方法忽略所有内容,包括下一个换行符。它不太健壮,因为整数的格式化输入可以将流置于错误模式,忽略进一步的输入操作,直到错误模式被清除。

重新使用数组,最好使用std::vector。那么你不需要决定一个固定的容量。

答案 1 :(得分:1)

@IBOutlet weak var segmented :UISegmentedControl? //Now for changing the title:- segmented?.setTitle("test1", forSegmentAtIndex: 0) segmented?.setTitle("test2", forSegmentAtIndex: 1) 读取数字,但在输入流中留下换行符。您第一次打电话给cin >> n会读取该信息,因此您可以使用空行开始。

答案 2 :(得分:0)

问题是你使用运算符&gt;&gt;混合调用getline()。 请记住,运营商&gt;&gt;忽略前导空格,因此将正确地跨越线边界继续。但是在成功检索到输入后停止阅读,因此不会吞下尾随&#39; \ n&#39;字符。因此,如果您在&gt;&gt;之后使用getline()除非你小心(首先删除未读取的&#39; \ n&#39;字符),否则你通常会得到错误的东西。

诀窍是不使用这两种类型的输入。 如果你在cin&gt;&gt;之后使用getline你的数据,你需要在两者之间刷新缓冲区。

    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        int n = 1;
        string data[13];
        while(n > 0){
            cin >> n;
            cin.ignore(10,'\n'); // insert this into your code
            for(int i = 0; i < n; i++){
                getline(cin,data[i]);
                cout << data[i] << endl;
            }
       }
       return 0;
    }