10

我有以下代码:

主文件

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

我注意到,如果我在姓名输入中放置一个空格,它不会给我输入姓名的机会,并且它将在空格之后的条目视为年龄。如果这是一个新手错误,我很抱歉,它可能是。我以前编写过 Java,并决定改用 C++,因为它更适合我的需要。我也可能按照你的标准格式化我的代码,如果你愿意,请更正它。

控制台截图

我还注意到另一个错误,这是我在 Java 中从未真正遇到过的问题。我不知道如何防止它在完成处理后立即关闭。我听说你可以使用 "system.("pause"); 但我也被告知不要使用它。我真的很困惑该使用什么。我听说过使用 getchar();,但是它似乎没有做任何事情。

任何帮助将不胜感激,因为我是 C++ 的初学者。

4

3 回答 3

16

以下是运行程序时输入缓冲区发生的情况:

std::cin >> name;

您正在等待输入。当您输入“Ryan Cleary”并按下回车键时,输入缓冲区包含:

Ryan Cleary\n

现在您cin可以正常读取输入,在空白处停止,让您的缓冲区如下所示:

 Cleary\n

注意开头的空格,因为它在 read 后停止Ryan。您的第一个变量现在包含Ryan. 但是,如果您想要全名,请使用std::getline. 它将读取到换行符,而不仅仅是空格。无论如何,继续:

std::cin >> age;

现在你得到另一个输入。不过,那里已经有东西了。它会跳过空白,直到它可以开始读取,只留下缓冲区:

\n

您的第二个变量获取 text Cleary。请注意仍在缓冲区中的换行符,这将我带到第二部分。system ("pause");以一种始终有效的方式进行替换是很棘手的。您最好的选择通常是使用不太完美的解决方案,或者像我喜欢做的那样,不能保证完全按照它所说的那样做:

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

主要的坏事system("pause");是你不知道它将在别人的计算机上运行什么程序。他们本可以更改pause.exe或放置一个最先找到的,而您无法知道。这可能会破坏他们的计算机,因为它可能是任何程序。

于 2012-07-12T23:26:12.200 回答
7

您应该尝试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

(当然,您可以省略std::行中的部分,因为您已经通知编译器您正在使用std命名空间)

于 2012-07-12T23:10:24.593 回答
0

在 C++ 编程语言getline(cin, name);中用于字符串变量输入。

Wherecin可以是任意的istream,并且name是您要保存该值的字符串。

于 2020-05-04T19:45:06.303 回答