std :: cin用空格输入?

duk*_*vin 129 c++ string space

#include <string>

std::string input;
std::cin >> input;
Run Code Online (Sandbox Code Playgroud)

用户想要输入"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);
Run Code Online (Sandbox Code Playgroud)

这会产生错误.有任何想法吗?

Lig*_*ica 190

它没有"失败"; 它只是停止阅读.它将词法标记视为"字符串".

用途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;
}
Run Code Online (Sandbox Code Playgroud)

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

更新

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

你试图getline进入int一个字符串或字符缓冲区.流的格式化操作仅适用于operator<<operator>>.要么使用其中一个(并相应调整多字输入),要么使用getline和词法转换为int事后.

  • 我喜欢这个答案比接受的答案好得多,因为我不需要指定字符长度。 (2认同)
  • @TheWanderer 确实,这是一个很大的好处。 (2认同)

Pet*_*ete 94

你必须使用cin.getline():

char input[100];
cin.getline(input,sizeof(input));
Run Code Online (Sandbox Code Playgroud)

  • EW; 为什么要使用`char`-buffers?这是2011年. (51认同)
  • @Kevin Meh,它发生了.C++并不像我们希望的那样直观. (7认同)
  • 你的答案并不可怕,也不需要贬低.我确实认为两个小改动会改善它.更改1将在调用`cin.getline()`时使用`sizeof(input)`代替100; 这意味着您可以更改输入缓冲区的大小,只需要更改一行而不是两行.变化2.将测试从`cin.getline回报()`使用,例如,如果`(!cin.getline(输入的sizeof(输入))){...手柄EOF或错误...} "或类似的东西,提醒OP,输入操作特别容易受到意外行为的影响.其他答案也需要这个. (7认同)
  • 为什么不使用`cin.getline(input,sizeof(input));`?另外,你不应该检查退货状态吗? (3认同)
  • @JonathanLeffler在撰写本文时,这是我对最初提出的问题的答案(查看实际问题的第一条评论,您将看到由于OP的编辑而导致上下文发生了变化).无论哪种方式,如果你觉得答案是那么可怕,那就投降吧.我承认这可能不是"最佳"解决方案,但它不是一个解决方案.而不是问我为什么不使用某些东西,你可以告诉我们为什么我们应该按照你的方式去做. (2认同)

小智 24

使用 :

getline(cin, input);
Run Code Online (Sandbox Code Playgroud)

该功能可以在

#include <string>
Run Code Online (Sandbox Code Playgroud)

  • @blembo:真的吗?因为我的答案发布于此之前三年多,所以答案完全相同(与您所说的相反)。 (3认同)
  • +1这是唯一对我有用的答案.其余的答案说使用cin.getline(),但这只是给了我一个错误,说该函数不存在. (2认同)

dev*_* gr 21

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

std::string s;
std::getline(std::cin >> std::ws, s);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是迄今为止最好的答案。我可以将其与上面的std :: cin &gt;&gt;结合使用。 (3认同)
  • 迄今为止最好的答案。当使用 `std::getline(std::cin, s)` 时,我会得到一个非常混乱的结果,我想说的是,在 `while`/`for` 循环中等待输入时会中断输入。这个选项解决了我的问题! (2认同)

Cod*_*ody 12

你想在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;
}
Run Code Online (Sandbox Code Playgroud)

这里开始的例子.查看更多信息和示例.

  • 实际上,你很少想使用member -`getline`.它已经过时了.使用免费的`getline`,可以与`std :: string`一起使用.[BTW,cplusplus.com是_not_推荐资源] (12认同)
  • @KevinDuke:教程可能会误导和不准确,并且引用包含大量错误.[这些](http://jcatki.no-ip.org/fncpp/Resources)是很好的资源. (6认同)
  • @Tomalak 为什么不推荐 cplusplus.com?我一直都在用 :P (2认同)
  • 对于文档链接,cppreference.com 是 cplusplus.com 的有效替代品(两者都是非官方释义) (2认同)

abe*_*312 5

C方式

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

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

  • 非常糟糕的建议,`gets` 不可能安全使用。它甚至在 C11 中被完全删除。 (11认同)

Bui*_*ded 5

如何从输入中读取字符串?

您可以std::cin像这样读取单个以空格结尾的单词:

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

int main()
{
    cout << "Please enter a word:\n";

    string s;
    cin>>s;

    cout << "You entered " << s << '\n';
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有明确的内存管理,也没有可能溢出的固定大小的缓冲区。如果你真的需要一整行(而不仅仅是一个词),你可以这样做:

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

int main()
{
    cout << "Please enter a line:\n";

    string s;
    getline(cin,s);

    cout << "You entered " << s << '\n';
}
Run Code Online (Sandbox Code Playgroud)