C++ std::getline在for循环中不工作
我试图在一个字符串变量中收集用户的输入,该变量在指定的时间内接受空白 因为通常的C++ std::getline在for循环中不工作,c++,getline,C++,Getline,我试图在一个字符串变量中收集用户的输入,该变量在指定的时间内接受空白 因为通常的cin>>str不接受空格,所以我选择std::getline from 这是我的密码: #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { int n; cin >> n;
cin>>str
不接受空格,所以我选择std::getline from
这是我的密码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
string local;
getline(cin, local); // This simply does not work. Just skipped without a reason.
//............................
}
//............................
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
对于(int i=0;i
有什么想法吗?你在按回车键吗?如果没有,get行将不返回任何内容,因为它正在等待行结束…
- n是否从输入正确初始化
- 您似乎没有对getline进行任何操作。这是你想要的吗
- getline返回一个istream引用。你把它扔在地上有关系吗
n
,因此它转换为零。因为0不小于0,所以循环永远不会执行
我要添加一些工具:
int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
intn;
cin>>n;
您在哪个编译器上尝试过这个?我试过VC2008,效果很好。如果我在g++(GCC)3.4.2上编译了相同的代码。它不能正常工作。下面是两个编译器中使用的版本。我的环境中没有最新的g++编译器
int n;
cin >> n;
string local;
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2.
for (int i = 0; i < n; i++)
{
getline(cin, local);
cout << local;
}
intn;
cin>>n;
字符串本地;
getline(cin,本地);//在VC2008上不需要这个。但是在g++3.4.2上需要它。
对于(int i=0;i cout如果您输出存储在local
中的内容(顺便说一句,这是一个糟糕的变量名:p),您可以看到为什么失败:
这一切按预期进行
题外话,可能只是为了手头的代码片段,但是如果没有使用名称空间std;
,代码的可读性会更高。这违背了名称空间的目的。不过,我怀疑这只是为了在这里发布。重要的问题是“您如何处理让您认为输入被跳过的字符串?”或者更准确地说,“您认为输入被跳过的原因是什么?”
如果您正在单步执行调试器,是否使用优化进行编译(允许对指令重新排序)?我不认为这是您的问题,但这是可能的
我认为更有可能是字符串已填充,但未正确处理。例如,如果要将输入传递给旧的C函数(例如,atoi()
),则需要提取C样式字符串(local.C_str()
).声明一个字符,以便在键入数字后返回。char ws;int n;cin>>n;ws=cin.get();
这将解决问题
使用cin>>ws
而不是ws=cin.get()
,将使字符串的第一个字符位于变量ws
中,而不仅仅是清除'\n'
您可以使用分隔符直接在字符串中使用getline函数,如下所示:
#include <iostream>
using namespace std;
int main()
{
string str;
getline(cin,str,'#');
getline(cin,str,'#');
}
#包括
使用名称空间std;
int main()
{
字符串str;
getline(cin,str,#');
getline(cin,str,#');
}
您可以根据需要多次输入str,但这里的一个条件是,您需要将“#”(第三个参数)作为分隔符传递,即字符串将接受输入,直到按下“#”为止,而不考虑换行符。这很简单。
U jst需要在循环的末尾放置一个cin.get()。只需在循环之前使用cin.sync()
。在getline(cin,local)
之前,只要添加if(i==0){cin ignore();}
。这将删除最后一个字符(\n
)从字符串中删除,这会导致此问题,并且仅在第一个循环中需要。否则,它将在每次迭代时从字符串中删除最后一个字符。例如
i = 0 -> string
i = 1 -> strin
i = 2 -> stri
诸如此类。很少会无缘无故失败。在for循环之前尝试以下操作:std::cout Yes。n被正确读取。我为n输入了2,它会打印“n:2”。我想我已经解决了您的问题。但是关于调试,您尝试了除2以外的其他值,对吗?循环被输入,它只是“跳过”"第一个条目。否。循环确实执行。我使用VC++2008,因此我可以通过逐行跟踪代码进行调试。是的。我尝试打印它,并且n
正确初始化。--我在getline之后切断了代码。我自己倾向于显式使用std::namespace前缀,但在cpp中使用声明没有错(不是h)文件。可能在这样一个简单的例子中。虽然名称空间std
中有很多东西。函数级别是我使用指令时使用的最全局的。同样的可以插入循环中。仅仅分发修复程序没有帮助。请解释您的答案,以便对OP和社区中的其他人有益。背后的“原因”比“修复”更重要。
#include <iostream>
using namespace std;
int main()
{
string str;
getline(cin,str,'#');
getline(cin,str,'#');
}
i = 0 -> string
i = 1 -> strin
i = 2 -> stri