C++ getline()是否不提取分隔符?
我输入了一些整数,然后输入了一些句子 此代码工作正常:C++ getline()是否不提取分隔符?,c++,getline,C++,Getline,我输入了一些整数,然后输入了一些句子 此代码工作正常: #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;
#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;
}
}
然而,当我试图在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;
}
}
..并在那里终止,而不是接受所有三个输入。
为什么呢?cin>>ws从输入中提取所有空白,但getline()不是也这样做吗?那么,当我在forloop中省略cin>>ws时,为什么它不能正常工作呢 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";
}
}
}
if(cin>>n>>b>>c>>std::ws){
对于(i=0;istd::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";
}
}
}
if(cin>>n>>b>>c>>std::ws){
对于(i=0;igetline()的默认分隔符是“\n”,因此不需要在getline调用中包含该分隔符,但它不应更改功能
例如,见
从整数输入到getline()输入的格式更改会在整数后面留下一些空格(endl),如@DietmarKühl所述
您可以更改getline()调用以消除分隔符
getline(cin,s);
这将导致getline()使用“\n”作为默认分隔符
我修改了“n”变量以进行计数,并删除了其他整数,使代码更易于阅读:
#包括
int main()
{
int i;//索引
int count;//要接受的字符串数
std::字符串str;
std::cout计数;
如果(std::cin>>计数>>std::ws){
对于(i=0;i std::coutgetline()的默认分隔符是“\n”,因此无需在getline调用中包含该分隔符,但它不应更改功能
例如,见
从整数输入到getline()输入的格式更改会在整数后面留下一些空格(endl),如@DietmarKühl所述
您可以更改getline()调用以消除分隔符
getline(cin,s);
这将导致getline()使用“\n”作为默认分隔符
我修改了“n”变量以进行计数,并删除了其他整数,使代码更易于阅读:
#包括
int main()
{
int i;//索引
int count;//要接受的字符串数
std::字符串str;
std::cout计数;
如果(std::cin>>计数>>std::ws){
对于(i=0;i Cin不会提取所有的空格,它只获取第一个单词直到第一个空格。这就像有一个带有空格分隔符的getline(不完全是但接近)
Getline接受整行,并具有如上所述的默认“\n”分隔符
例:
可以为您提供堆栈,getline将为您提供该行的所有内容Cin不提取所有空格,它只获取第一个单词,直到第一个空格。这就像有一个带有空格分隔符的getline(不完全是,但接近)
Getline接受整行,并具有如上所述的默认“\n”分隔符
例:
当您使用cin>
时,它不会删除输入后的任何空白。这意味着终止前3个输入的换行仍然在缓冲区中,等待第一个getline
读取。因为换行之前没有任何内容,所以第一个getline
传递了一个空字符串。您的输出应该包含一个换行符,这样您就可以看到空行,这样就有意义了
最初,您发布的代码在for
循环之前显示了一个cin>>ws
,这将消除此问题。当您使用cin>
时,它不会删除输入后的任何空白。这意味着终止前3个输入的换行仍在缓冲区中,等待第一个输入读取getline
。由于换行符之前没有任何内容,因此第一个getline
传递了一个空字符串。您的输出应该包含一个换行符,这样您就可以看到空行,这样就有意义了
最初,您发布的代码在for
循环之前显示了一个cin>>ws
,这将消除此问题。这实际上是不正确的:getline()
有两个停止的原因:找到分隔符或找到流的结尾。它不会停止
if (cin>>n>>b>>c >> std::ws) {
for(i=0;i<n;i++){
if (getline(cin,s,'\n')) {
cout << "i=" << i << ":'" << s << "'\n";
}
}
}
string a = "Stack Overflow is awesome";