带空格的C++输入字符串

问题描述:

我正在编写一个程序,它接受来自用户的输入。我需要输入来包含单词之间的空格。我无法找到解决方案来做到这一点。 在问你之前,我用同样的问题在*上尝试了多个其他问题。这些是我尝试过的一些。 How to cin Space in c++?带空格的C++输入字符串

std::cin input with spaces?

Demonstration of noskipws in C++

Effect of noskipws on cin>>

我的代码的问题是,一旦我setBusinessName方法被调用,它只是完成了自己。它输出然后返回,而不用等待我输入数据。帮助嘀......

string setBusinessName() 
{ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    getline(cin, name, '\n'); 
    cout << name; 
    return name; 
} 
+5

听起来像你可能混合'>>'和'getline'。 '>>'在流中留下未解析的空白,通常留下行标记以让getline跳过。需要看到[mcve],以确保这是你遇到的,但。 – user4581301

+1

试试这个编辑:[链接](http://cpp.sh/45q6s) –

我不能评论的是,没有足够的积分,但你尝试getline(cin, name, '\n');之前添加cin.ignore();

像这样:

string setBusinessName() 
{ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    cin.ignore(); 
    getline(cin, name, '\n'); 
    cout << name; 
    return name; 
} 
+0

虽然我很确定这解决了OP的问题,但在一般情况下这是一个糟糕的想法。如果缓冲区中没有悬空的空白,您只需输入有效的输入。最好把'ignore'放在'>>'之后,你知道应该有一个EOL并将'ignore()'升级到'cin.ignore(numeric_limits :: max(),'\ n');'just除了EOL之外,确保没有空间或别的东西在等待。 – user4581301

这是工作的罚款。我只是试过这个。

#include <iostream> 
#include <string> 
using namespace std; 

string setBusinessName(){ 
    string name = ""; 
    cout << "The name you desire for your business:"; 
    getline(cin, name); 
    cout << name; 
    return name; 
} 

int main() { 
    setBusinessName(); 
    system("PAUSE"); 
} 
+0

系统(“PAUSE”)做什么? –

+0

它暂停输出控制台。每当程序返回结果时,它都会帮助输出控制台暂停,直到关闭窗口。 – Chip

只是增加了评论的一些更多的解释,当你这样做:

cout << "Enter value:"; 
cin >> x; 

当用户按下输入的CIN指令被执行,所以输入缓冲器具有用户插入的值和一个额外的'\n'字符。如果继续执行cin即可,但如果您想要使用getline(就像您的情况在字符串中包含空格),您必须知道getline将在缓冲区中第一次出现'\n'时停止,所以从getline将为空。

为了避免这种情况,如果你真的必须同时使用CIN和函数getline,您需要使用cin.ignore(streamsize n = 1, int delim = EOF)移除'\n'从缓冲区,这个函数会清除缓存streamsize字符,直到匹配delim的第一个字符(含),这里有一个例子:

cin << x; 
cin.ignore(256, '\n'); 
getline(cin, name, '\n'); 

注意,建议使用:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

如果您不想猜测缓冲区中有多少个字符。

+0

有帮助 - 'std :: cin.ignore()' - http://www.cplusplus.com/forum/beginner/9148/ – parasrish

有可能流中已有东西,并且getline()只是读取它。

确保在此功能之前没有使用cin>>。 并且您可以在getline()之前使用cin.ignore()来避免流中已有的内容。