我有以下代码:
main.cpp中
#include
#include
using namespace std;
string name;
string age;
int main() {
cout <
cin >> name;
cout << endl;
cout <
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;
}
我注意到如果我在输入中输入一个空格来表示它不会给我输入名称的机会,它会在空格后查看该条目作为年龄.如果这是一个新手错误,我很抱歉,这可能是.我以前编写过Java并决定切换到C,因为它更适合我的需求.我也可能将我的代码格式化为您的标准,如果您愿意,请更正.
我也注意到了另一个错误,我在Java中从来没有遇到任何问题.我无法弄清楚如何防止它在完成处理后立即关闭.我听说你可以使用“system.(”pause“);但我也被告知不要使用它.我对使用什么感到困惑.我听说过使用getchar();,但是它似乎没有做任何事情.
任何帮助都将非常感激,因为我是C的完全初学者.
解决方法:
以下是运行程序时输入缓冲区发生的情况:
std::cin >> name;
你在等待输入.当您输入“Ryan Cleary”并按Enter键时,输入缓冲区包含:
Ryan Cleary\n
现在你的cin正常读取输入,停在空白处,像这样留下你的缓冲区:
Cleary\n
注意起始空间,因为它在阅读Ryan后停止.你的第一个变量现在包含Ryan.但是,如果您想要全名,请使用std::getline.它将读取直到换行符,而不仅仅是空格.无论如何,继续:
std::cin >> age;
现在你得到了另一个输入.不过已经有了一些东西.它跳过空白直到它可以开始读取,只留下缓冲区:
\n
你的第二个变量得到Cleary文本.注意换行符仍在缓冲区中,这将我带到第二部分.更换系统(“暂停”);以一种始终有效的方式是棘手的.您最好的选择通常是使用不太完美的解决方案,或者我喜欢的方式,不能保证完全按照它说的做到:
std::cin.get(); //this consumes the left over newline and exits without waiting
好的,所以cin.get()没有用.这个怎么样:
std::cin.get(); //consume left over newline
std::cin.get(); //wait
这样做很完美,但是如果你将它复制粘贴到没有留下换行符的地方呢?你必须输入两次!
解决方案是清除换行符(以及其他任何内容),然后等待.这是cin.sync()的目的.但是,如注释部分所示,不能保证像所说的那样清除缓冲区,因此如果编译器选择不这样做,则不能使用它.然而,对我来说,确实如此,留下了以下解决方案:
std::cin.sync(); //clear buffer
std::cin.get(); //wait
关于系统的主要坏处(“暂停”);是你不知道它会在别人的电脑上运行什么程序.他们可能已经改变了pause.exe或者先找到了一个,你无法知道.这可能会破坏他们的计算机,因为它可能是任何程序.
标签:c,string,input
来源: https://codeday.me/bug/20190926/1818595.html