考虑以下代码:
#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.
我想删除不需要的空格。
答案 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;
}