Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::getline在for循环中不工作_C++_Getline - Fatal编程技术网

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;icout如果您输出存储在
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