所以我先输入一些整数,然后再输入一些句子。
此代码可以正常工作:
#include<bits/stdc++.h>
using namespace std;
main(){
int c,b,n,i;string s;
cin>>n>>b>>c;
for(i=0;i<n;i++){
cin>>ws;
getline(cin,s,'\n');
cout<<s;
}
}
示例:
3 3 3
This is weird
This is weirdDefinitely makes
Definitely makesNo sense
No sense
但是,当我尝试在forloop中省略cin >> ws时,它无法正常工作,例如此代码段,
#include<bits/stdc++.h>
using namespace std;
main(){
int c,b,n,i;string s;
cin>>n>>b>>c;
for(i=0;i<n;i++){
getline(cin,s,'\n');
cout<<s;
}
}
示例:
3 3 3
This is weird
This is weirdDefinitely makes
Definitely makes
..并在那里终止而不是全部输入三个。 这是为什么? cin >> ws从输入中提取所有空格,但是getline()也不这样做吗?那么当我在forloop中省略cin >> ws时,为什么它不能正常工作?
答案 0 :(得分:2)
std::getline()
提取字符,直到提取第一个定界符(默认为'\ n')。定界符未存储在结果中,但已将其提取。它不会不提取一般或多个定界符的空格。
顺便说一句:总是检查输入是否在尝试读取值后 有效。
在打印的示例中,问题在于格式化输入后(即使用>>
运算符)之后,没有提取空格。即,对std::getline()
的第一次调用提取以初始换行符结尾的空字符串。在格式化和未格式化的I / O之间切换时,通常有必要提取尾随空白。也就是说,您想要类似的代码
if (cin>>n>>b>>c >> std::ws) {
for(i=0;i<n;i++){
if (getline(cin,s,'\n')) {
cout << "i=" << i << ":'" << s << "'\n";
}
}
}
我不建议输入操作而不添加成功检查。更改输出以使其更容易看到正在发生的事情:在有/没有此特定std::endl
的情况下尝试代码,以查看正在发生的情况。
答案 1 :(得分:0)
getline()的默认定界符为'\ n',因此无需在getline调用中包含该定界符,尽管它不应更改功能。
如@DietmarKühl所述,从整数输入到getline()输入的格式更改将在整数后留一些空格(endl)。
您可以更改getline()调用以将分隔符消除为
getline(cin,s);
这将导致getline()使用'\ n'作为默认分隔符。
我修改了'n'变量以计数并删除了其他整数,以使代码更易于阅读:
#include <iostream>
int main()
{
int i; // index
int count; // number of strings to accept
std::string str;
std::cout << "Input the number of strings you would like me to process: " << std::endl;
std::cin >> count;
if (std::cin >> count >> std::ws) {
for (i = 0; i < count; i++) {
if (getline(std::cin, str)) {
std::cout << "i=" << i << ":'" << str << "'\n";
}
}
}
}
答案 2 :(得分:0)
Cin不会提取所有空格,它只会得到第一个单词,直到第一个空格。就像有一条带有空格定界符的getline(不完全但很接近)。
Getline使用整行,并具有如上所述的默认'\ n'分隔符。
例如:
string a = "Stack Overflow is awesome";
可以给你Stack和getline可以给你那一行的一切
答案 3 :(得分:0)
使用cin >>
时,输入后不会删除任何空格。这意味着终止前三个输入的换行符仍在缓冲区中,等待被第一个getline
读取。由于换行符之前没有任何内容,因此第一个getline
传递了一个空字符串。您的输出应该包含换行符,这样您就可以看到空行,然后才有意义。
您最初发布的代码在cin >> ws
循环之前显示了for
,这可以消除此问题。