我有以下代码:
#include <iostream>
#include <string>
using namespace std;
string name;
string age;
int main() {
cout <<"Name: ";
cin >> name;
cout << endl;
cout <<"Age: ";
cin >> age;
cout << endl;
cout << "Your name is " << name << ", and you are " << age << " years old." << endl;
cout << "Press enter to close this application" << endl;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我注意到如果我在输入中输入一个空格来表示它不会给我输入名称的机会,它会在空格后查看该条目作为年龄.如果这是一个新手的错误,我很抱歉,这可能是.我之前编写过Java并决定转换到C++,因为它更适合我的需求.我也可能将我的代码格式化为您的标准,如果您愿意,请更正.

我也注意到了另一个错误,我在Java中从来没有遇到任何问题.我无法弄清楚如何防止它在完成处理后立即关闭.我听说你可以使用"(暂停")系统.";但我也被告知不要使用它,我什么就用我听说使用的getchar()真的很困惑;不过.它似乎没有做任何事情.
任何帮助都会非常感激,因为我在C++方面是一个完全的初学者.
chr*_*ris 15
以下是运行程序时输入缓冲区发生的情况:
std::cin >> name;
Run Code Online (Sandbox Code Playgroud)
你在等待输入.当您输入"Ryan Cleary"并按Enter键时,输入缓冲区包含:
Ryan Cleary\n
Run Code Online (Sandbox Code Playgroud)
现在您cin正常读取输入,在空白处停止,留下您的缓冲区,如下所示:
Cleary\n
Run Code Online (Sandbox Code Playgroud)
请注意开始空间,因为它在读取后停止Ryan.你的第一个变量现在包含Ryan.但是,如果您想要全名,请使用std::getline.它将读取直到换行符,而不仅仅是空格.无论如何,继续:
std::cin >> age;
Run Code Online (Sandbox Code Playgroud)
现在你得到了另一个输入.不过已经有了一些东西.它跳过空白直到它可以开始读取,只留下缓冲区:
\n
Run Code Online (Sandbox Code Playgroud)
你的第二个变量获取文本Cleary.注意换行符仍在缓冲区中,这将我带到第二部分.system ("pause");以一种始终有效的方式替换是棘手的.您最好的选择通常是使用不太完美的解决方案,或者我喜欢的方式,不能保证完全按照它说的做到:
std::cin.get(); //this consumes the left over newline and exits without waiting
Run Code Online (Sandbox Code Playgroud)
好的,所以cin.get()没有用.这个怎么样:
std::cin.get(); //consume left over newline
std::cin.get(); //wait
Run Code Online (Sandbox Code Playgroud)
这样做很完美,但是如果你将它复制粘贴到没有留下换行符的地方呢?你必须输入两次!
解决方案是清除换行符(以及其他任何内容),然后等待.这是目的cin.sync().但是,如注释部分所示,不能保证像所说的那样清除缓冲区,因此如果编译器选择不这样做,则不能使用它.然而,对我来说,确实如此,留下了以下解决方案:
std::cin.sync(); //clear buffer
std::cin.get(); //wait
Run Code Online (Sandbox Code Playgroud)
最糟糕的system("pause");是你不知道它会在别人的电脑上运行什么程序.他们可以改变pause.exe或放置一个先找到的,你无法知道.这可能会破坏他们的计算机,因为它可能是任何程序.
您应该尝试cin.getline,这样,流将被读取,直到第一个换行符.
有人指出,好的,糟糕的建议.您可以使用std :: getline读取整行.除非得到通知,否则分隔符是换行符.要读取cin,您可以将其作为第一个参数传递(并将字符串作为第二个参数).
std::string str;
std::getline(cin, str); // to read until the end of line
std::getline(cin, str, ' '); // to read until a space character, for instance
Run Code Online (Sandbox Code Playgroud)
(当然,你可以省略行中的std::部分,因为你已经通知编译器你正在使用std命名空间)