gpt4 book ai didi

c++ - 使用字符串类输入空格时出现 cin 问题

转载 作者:可可西里 更新时间:2023-11-01 15:39:13 25 4
gpt4 key购买 nike

我有以下代码:

main.cpp

#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++,因为它更适合我的需要。我也可能按照您的标准格式化我的代码,如果您愿意,请更正它。

Screenshot of console

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

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

最佳答案

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

std::cin >> name;

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

Ryan Cleary\n

现在您的 cin 正常读取输入,在空格处停止,让您的缓冲区像这样:

 Cleary\n

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

std::cin >> age;

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

\n

您的第二个变量获取文本 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

这很完美,但是如果您将它复制粘贴到没有换行符的地方怎么办?您必须按两次 Enter 键!

解决方案是清除换行符(和其他任何内容),然后等待。这就是cin.sync()的目的.但是,如注释部分所示,不能保证像它所说的那样清除缓冲区,因此如果您的编译器选择不这样做,则无法使用。然而,对我来说,它正是这样做的,留下了一个解决方案:

std::cin.sync(); //clear buffer
std::cin.get(); //wait

system("pause"); 的主要缺点是您不知道它将在其他人的计算机上运行什么程序。他们可能更改了 pause.exe 或将找到的文件放在最前面,而您无从知晓。这可能会损坏他们的计算机,因为它可能是任何程序。

关于c++ - 使用字符串类输入空格时出现 cin 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com