#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中被完全删除了。
谢谢你指出...更新。