std :: cin输入带有空格?


144
#include <string>

std::string input;
std::cin >> input;

用户想要输入“ Hello World”。但是cin在两个词之间的空格处失败。我如何才能cin吸收全部Hello World

我实际上是用结构体cin.getline来做的,似乎没有用。这是我的代码:

struct cd
{
    std::string CDTitle[50];
    std::string Artist[50];
    int number_of_songs[50];
};

std::cin.getline(library.number_of_songs[libNumber], 250);

这产生一个错误。有任何想法吗?


27
您不应该编辑问题来提出类似的新问题。原因是人们已经对您的原始问题给出了答案,而现在这些答案似乎已脱离上下文。如果您的原始问题已得到回答,请开始一个新问题,以免造成混淆。
皮特

经过一番检查后很明显,但是请您为该变量添加一个声明,library以便清楚地知道它的类型cd
chandsie 2011年

抱歉,这是仓促完成的,我将重新发布。
柠檬

1
如果您打算通过替换方式将其重新发布,请标记该问题以便通过mod删除。
Lightness Races in Orbit

2
在您的更新中,您尝试getline进入int。当然失败了。
Ben Voigt

Answers:


102

您必须使用cin.getline()

char input[100];
cin.getline(input,sizeof(input));

7
@Kevin Meh,它发生了。C ++并不像我们希望的那样直观。
皮特

61
w 为什么使用char-buffers?这是2011
。– Lightness Races in Orbit

3
为什么不使用cin.getline(input, sizeof(input));?另外,您不应该检查退货状态吗?
乔纳森·勒夫勒

2
@JonathanLeffler在撰写本文时,这是我对最初提出的问题的答案(查看实际问题的第一个评论,您将看到上下文由于OP的编辑而发生了变化)。无论哪种方式,如果您认为答案是那么糟糕,请反对。我承认这可能不是“最佳”解决方案,但这同样是一个解决方案。您可以告诉我们所有人为什么我们应该按自己的方式去做,而不是问我为什么不使用某些东西。
皮特

7
您的答案并不糟糕,不需要投票。我确实认为两个小的更改将改善它。更改1将sizeof(input)代替对100的调用cin.getline();这意味着您可以更改输入缓冲区的大小,只需要更改一行而不是两行即可。变更2将cin.getline()通过使用(例如)if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }类似的方法来测试返回值,以提醒OP特别是输入操作容易受到意外行为的影响。其他答案也需要这个。
乔纳森·勒夫勒

215

它不会“失败”;它只是停止阅读。它会将词汇标记视为“字符串”。

用途std::getline

int main()
{
   std::string name, title;

   std::cout << "Enter your name: ";
   std::getline(std::cin, name);

   std::cout << "Enter your favourite movie: ";
   std::getline(std::cin, title);

   std::cout << name << "'s favourite movie is " << title;
}

请注意,这是一样std::istream::getline,这与C风格的作品char缓冲区,而不是std::string秒。

更新资料

您编辑的问题与原始问题几乎没有相似之处。

您试图getline插入int,而不是字符串或字符缓冲区。流的格式化操作仅适用于operator<<operator>>。可以使用其中之一(并针对多字输入进行相应的调整),也可以使用getline词法转换为int事后知识。


2
我喜欢这个答案比接受的答案好得多,因为我不需要指定字符长度。
TheWanderer

1
@TheWanderer确实,这是一个很大的好处。
Lightness Races in Orbit

记住要包含sstream:#include <sstream>
GilbertS

@LightnessRacesinOrbit,可以帮忙吗?这在打印输出时无缘无故给了我额外的换行符。
Anshuman Kumar

我认为@AnshumanKumar getline可能在返回的字符串中包含终止换行符。如果是这样,则由您决定删除它。
Mark Ransom

31

标准库提供了一个名为的输入函数ws,该函数会消耗输入流中的空白。您可以像这样使用它:

std::string s;
std::getline(std::cin >> std::ws, s);

4
我认为这是迄今为止最好的答案。我可以将其与上面的std :: cin >>结合使用。
安德拉

1
到目前为止最好的答案。使用时,std::getline(std::cin, s)我会非常混乱,我会说,在while/ for循环中等待输入时中断了输入。此选项解决了我的问题!
omerowitz

包括sstream:#include <sstream>
GilbertS

24

用 :

getline(cin, input);

该功能可以在

#include <string>

2
+1这是唯一对我有用的答案。其余答案都说使用cin.getline(),但这只是给我一个错误,指出该函数不存在。
blembo 2015年

7
@blembo:真的吗?因为我的答案发布于此之前三年多,所以说的是完全相同的内容(与您所说的相反)。
Lightness Races in Orbit比赛'18

@blembo:如果cin.getline您的系统上不存在,则说明您做错了什么。很可能您传递了错误的论点。最好不要为自己的错误而责备他人...
轨道轻轨赛

13

您要在cin中使用.getline函数。

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

这里拿了一个例子。查阅更多信息和示例。


12
实际上,您很少想要使用member- getline。它已经过时了。请改用free getline,它可以与一起使用std::string。[顺便说一句,cplusplus.com 不是推荐资源]
Lightness Races in Orbit

1
@Tomalak为什么不建议cplusplus.com?我一直使用它:P
柠檬

6
@KevinDuke:这些教程可能会引起误解和不准确,并且参考文献包含大量错误。这些都是很好的资源。
Lightness Races in Orbit

1
@NickSweeting:是的;改用这个
轨道轻赛

1
对于文档链接,cppreference.com是cplusplus.com的有效替代品(均为非官方释义)
Ben Voigt

4

方式

您可以使用getscstdio(c中的stdio.h)中的函数:

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

C ++方式

gets 已在c ++ 11中删除。

[推荐]:您可以使用函数getline(CIN,名),这是在string.hcin.getline(名称,256),这是在iostream本身。

#include<iostream>
#include<string>
using namespace std;
int main(){

char name1[256];
string name2;
cin.getline(name1,256); // for input
getline(cin,name2); // for input
cout<<name1<<"\n"<<name2;// for printing
}

10
非常糟糕的建议,gets无法安全使用。它甚至在C11中已被完全删除。
马太福音

1

我宁愿使用以下方法来获取输入:

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

实际上,它非常容易使用,而不是为包含空格字符的字符串定义数组的总长度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.