c语言cin输入空格,关于c ++:带空格的std :: cin输入?

#include

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

对不起伙计们,这是匆忙做的,我会转发这个。

如果您要通过替换方式重新发布,请通过mod标记要删除的问题。

这里有好东西,不需要删除

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

你现在应该知道这个(考虑到这个问题的年龄),但你真的使用结构和数组错了。你应该有一个单独的CDTitle,一个Artist和一个number_of_songs的结构。然后有一个数组(或更好的std::vector)的结构。

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

使用std::getline:

int main()

{

std::string name, title;

std::cout <

std::getline(std::cin, name);

std::cout <

std::getline(std::cin, title);

std::cout << name <

}

请注意,这与std::istream::getline不同,后者适用于C风格的char缓冲区而不是std::string。

更新

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

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

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

@TheWanderer确实,这是一个重大的好处。

你必须使用cin.getline():

char input[100];

cin.getline(input,sizeof(input));

啊傻我,谢谢

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

EW;为什么要使用char -buffers?这是2011年。

为什么不使用cin.getline(input, sizeof(input));?另外,你不应该检查退货状态吗?

@JonathanLeffler在撰写本文时,这是我对最初提出的问题的答案(查看实际问题的第一条评论,您将看到由于OP的编辑而导致上下文发生了变化)。无论哪种方式,如果你觉得答案是那么可怕,那就投降吧。我承认这可能不是"最佳"解决方案,但它不是一个解决方案。而不是问我为什么不使用某些东西,你可以告诉我们为什么我们应该按照你的方式去做。

你的答案并不可怕,也不需要贬低。我确实认为两个小改动会改善它。在对cin.getline()的调用中,更改1将使用sizeof(input)代替100;这意味着您可以更改输入缓冲区的大小,只需要更改一行而不是两行。更改2将通过使用例如if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }或类似的东西来测试cin.getline()的返回,以提醒OP输入操作特别容易受到意外行为的影响。其他答案也需要这个。

使用 :

getline(cin, input);

该功能可以在

#include

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

@blembo:真的吗?因为我在这之前发布了三年多的答案,所说的完全相同(与你声称的相反)。

@blembo:如果你的系统上不存在cin.getline,那你就做错了。你很可能传递了错误的论点。最好不要因为你的错误而责怪他人......

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

std::string s;

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

我认为这是迄今为止最好的答案。我可以将它与上面的std :: cin >>结合起来。

你想在cin中使用.getline函数。

#include

using namespace std;

int main () {

char name[256], title[256];

cout <

cin.getline (name,256);

cout <

cin.getline (title,256);

cout << name <

return 0;

}

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

实际上,您很少想使用member- getline。它已经过时了。使用free getline,可以与std::string一起使用。 [BTW,cplusplus.com不是推荐的资源]

那我该怎么用?在极少数情况下,我正在做c ++并且需要参考,cplusplus.com始终是我的第一个谷歌结果。

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

@KevinDuke:教程可能会误导和不准确,并且引用包含大量错误。这些都是很好的资源。

谢谢,这很棒!

死链接? @LightnessRacesinOrbit

@NickSweeting:是的;改用它。

对于文档链接,cppreference.com是cplusplus.com的有效替代品(两者都是非官方释义)

C方式

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

#include

int main(){

char name[256];

gets(name); // for input

puts(name);// for printing

}

C ++方式

在c ++ 11中删除了gets。

[推荐]:您可以使用string.h中的getline(cin,name)

或cin.getline(name,256),它位于iostream本身。

#include

#include

using namespace std;

int main(){

char name1[256];

string name2;

cin.getline(name1,256); // for input

getline(cin,name2); // for input

cout<

"<

}

非常糟糕的建议,gets是不可能安全使用的。它甚至在C11中被完全删除了。

谢谢你指出...更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值