std::cin 输入带空格?

Posted

技术标签:

【中文标题】std::cin 输入带空格?【英文标题】:std::cin input with spaces? 【发布时间】:2011-04-30 00:48:33 【问题描述】:
#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);

这会产生错误。有什么想法吗?

【问题讨论】:

你不应该编辑你的问题来提出这样的新问题。原因是人们已经对您的原始问题给出了答案,而现在这些答案似乎与上下文无关。如果您的原始问题已经得到解答,只需开始一个新问题以避免混淆。 经过一番检查后很明显,但请您为变量 library 添加一个声明,以便清楚它是 cd 类型的 对不起各位,这太匆忙了,我会重新发布。 如果您打算通过替换的方式重新发布它,请标记该问题以由模组删除。 在您的更新中,您尝试将getline 转换为int。当然失败了。 【参考方案1】:

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

使用std::getline:

#include <string>
#include <iostream>

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::strings。

更新

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

您试图将getline 转换为int,而不是字符串或字符缓冲区。流的格式化操作仅适用于operator&lt;&lt;operator&gt;&gt;。要么使用其中一个(并针对多词输入进行相应调整),要么使用 getline 并在事后将词法转换为 int

【讨论】:

我比接受的答案更喜欢这个答案,因为我不需要指定字符长度。 @TheWanderer 确实,这是一个很大的好处。 @LightnessRacesinOrbit,你能帮忙吗?这在打印我的输出时无缘无故地给了我一个额外的换行符。 @AnshumanKumar 我认为getline 可能在它返回的字符串中包含终止换行符。如果是这样,您可以自行删除它。【参考方案2】:

你必须使用cin.getline():

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

【讨论】:

@Kevin Meh,它发生了。 C++ 并不像我们希望的那样直观。 Ew;为什么使用char-buffers?现在是 2011 年。 为什么不使用cin.getline(input, sizeof(input));?另外,你不应该检查退货状态吗? @JonathanLeffler 在撰写本文时,这是我对最初提出的问题的答案(查看实际问题的第一条评论,您会看到上下文已更改为由 OP 进行编辑)。无论哪种方式,如果您觉得答案很糟糕,请投反对票。我承认这可能不是“最好的”解决方案,但它同样是一个解决方案。与其问我为什么不使用某些东西,你可以告诉我们为什么我们应该按照你的方式去做。 您的回答并不糟糕,也不需要投票。我确实认为两个小的变化会改善它。更改 1 将在对 cin.getline() 的调用中使用 sizeof(input) 代替 100;这意味着您可以更改输入缓冲区的大小,并且只需要更改一行而不是两行。更改 2 是通过使用例如 if (!cin.getline(input, sizeof(input))) ...handle EOF or error... 或类似的东西来测试从 cin.getline() 的返回,以提醒 OP 特别是输入操作容易受到意外行为的影响。其他答案也需要这个。【参考方案3】:

标准库提供了一个名为ws 的输入函数,它使用输入流中的空格。你可以这样使用它:

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

【讨论】:

我认为这是迄今为止最好的答案。我可以将它与上面的 std::cin>> 结合起来。 迄今为止的最佳答案。当使用std::getline(std::cin, s) 时,我会变得非常混乱,我会说,在while/for 循环中等待输入时输入中断。这个选项解决了我的问题! 包含流:#include 【参考方案4】:

使用:

getline(cin, input);

函数可以在

中找到
#include <string>

【讨论】:

+1 这是唯一对我有用的答案。其余的答案说要使用 cin.getline() 但这只是给了我一个错误,说该函数不存在。 @blembo:真的吗?因为我的答案在此之前三年多发布,说的是完全相同的事情(与您声称的内容相反)。 @blembo:如果你的系统上不存在cin.getline,那么你做错了什么。很可能您传递了错误的论点。最好不要因为你的错误而责怪别人...... @LightnessRacesinOrbit 我了解如何将此答案视为您答案的子集(内容方面)。该评论中提到的问题可能是该线程中呈现方式和答案顺序不同的结果(打勾和投票)。如果一个快速阅读者开始对 C 风格的 getline 不满意,然后是你的更长的答案(尽管对专注的读者很有用),然后是另一种使用 getline 的方式,读者可能最终会得出结论,这个答案是他们中更好的答案,它与您的基本相似,但方式简洁。【参考方案5】:

你想在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;

以here 为例。查看更多信息和示例。

【讨论】:

其实你很少想用m​​ember-getline。它已经过时了。请改用免费的getline,它可以与std::string 一起使用。 [顺便说一句,cplusplus.com 不是推荐资源] @Tomalak 为什么不推荐 cplusplus.com?我一直在使用它:P @KevinDuke:这些教程可能会产生误导和不准确,并且参考包含大量错误。 These 是很好的资源。 @NickSweeting:是的;请改用this。 对于文档链接,cppreference.com 是 cplusplus.com 的有效替代品(均为非官方释义)【参考方案6】:

C路

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

#include<cstdio>
int main()

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

C++ 方式

gets 在 c++11 中被移除。

[推荐]:你可以使用getline(cin,name),在string.h 或 cin.getline(name,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

【讨论】:

非常糟糕的建议,gets 无法安全使用。它甚至在 C11 中被完全删除。【参考方案7】:

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

您可以使用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';

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

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

【讨论】:

【参考方案8】:

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

#include <iostream>
#include <string>

using namespace std;

int main(void) 
    string name;

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

    return 0;

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

【讨论】:

以上是关于std::cin 输入带空格?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串变量分配给空格字符“”以查找重复的单词

C 不能输入带空格的字符串

c++利用cin.get()输入带空格的一串数据【追加悬赏】

输入带空格字符串的两种方法

c语言中怎样用scanf()读入带空格的字符串

java怎样读取带空格的字符串数组