我正在尝试将用户的输入收集到一个字符串变量中,该变量在指定的时间内接受空格。

由于平时 cin >> str 不接受空格,所以我会使用 std::getline from <string>

这是我的代码:

#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;
}

任何想法?

有帮助吗?

解决方案

您可以看到这是为什么你存储在local如果你输出什么(这是一个贫穷的变量名,顺便说一句:P):失败

#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);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

您将看到您输入号码后立即将其>后打印一个换行符。然后,它前进到输入的其余部分。

这是因为getline是给你输入你的电话号码留下的空行。 (它读取的次数,但显然不会删除\n,让你留下了一个空行。)您需要先被干掉任何剩余空白的:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    cin >> ws; // stream out any whitespace
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

这个作品如预期。

题外话,也许它只是为手头的片断,但代码往往是更多的可读性,如果你没有using namespace std;。它违背了命名空间的目的。我怀疑这只是张贴在这里,虽然。

其他提示

声明一个字符为获得马车回报,你已经在number.char ws;int n;cin>>n;ws=cin.get();输入后 这将解决这个问题。

  

使用cin>>ws代替ws=cin.get(),会让你的字符串的第一个字符是在可变ws,而不是仅仅清理'\n'的。

您按下回车键?如果不能获得行会返回任何结果,因为它正在等待行结束...

我的猜测是,你不读n正确的,所以它转换为零。由于0不小于0,则循环永远不会被执行。

我添加一点仪器:

int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
  • n 是否根据输入正确初始化?
  • 您似乎没有使用 getline 执行任何操作。这是你想要的吗?
  • getline 返回 istream 引用。你把它掉在地上这一事实有关系吗?

在哪个编译你尝试呢?我试图在VC2008和工作的罚款。如果我编译对于g ++(GCC)3.4.2相同的代码。它没有正常工作。下面是两种编译器工作的版本。我dont't有最新的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;
}

重要的问题是“你有什么用,让你的想法,输入跳过的字符串干什么?”或者,更准确的说,“为什么你认为输入跳了?”

如果您通过调试器步进,你与优化(这是允许指令重新排序)编译?我不认为这是你的问题,但它是一种可能性。

我认为这更可能是字符串被填充,但它没有被正确地处理。举例来说,如果你想通过输入旧的C函数(例如,atoi()),你需要解压到C风格的字符串(local.c_str())。

可以使用定界符直接使用getline函数的字符串如下:

#include <iostream>
using namespace std;
int main()
{
    string str;
    getline(cin,str,'#');
    getline(cin,str,'#');
}
你可以输入str作为多次,你想要的,但有一个条件适用于这里就是你需要通过“#”(第三个参数)作为分隔符,即字符串将接受输入直到“#”不管被按下换行符

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top