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

2024-03-30

我有以下代码:

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

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

任何帮助将不胜感激,因为我在 C++ 方面是一个完全的初学者。


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

std::cin >> name;

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

Ryan Cleary\n

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

 Cleary\n

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

std::cin >> age;

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

\n

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

std::cin.get(); //this consumes the left over newline and exits without waiting

可以,然后呢cin.get() http://en.cppreference.com/w/cpp/io/basic_istream/get没用。这个怎么样:

std::cin.get(); //consume left over newline
std::cin.get(); //wait

这工作得很好,但是如果你将它复制粘贴到没有留下换行符的地方怎么办?您必须按两次 Enter 键!

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

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

主要的坏处是system("pause");是你不知道它会在别人的计算机上运行什么程序。他们本可以改变pause.exe或者把找到的放在第一位,而你却无从得知。这可能会损坏他们的计算机,因为它可能any程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用字符串类输入空格时出现 cin 问题 的相关文章

随机推荐

  • PrintWriter 未打印出完整的字符串

    我有以下代码 FileWriter F new FileWriter out txt PrintWriter H new PrintWriter F H print split split length 2 H print END 然而 当
  • 如何在 TinyMCE 中允许自闭合标签?

    我的视频元素内的源标签需要自动关闭 这样 iPad 才不会开始抱怨 我输入
  • 如何在 android 的 logcat 中查看数组

    我想在 logcat 中记录原始数据 例如数组 这样我就知道输出是什么 假设我有一个数组 就像这样 File mp3List Log v test mp3List 为什么我不能将数组记录到控制台 我该怎么做 您无法记录该数组 因为它只是一个
  • unix/linux 套接字中的阻塞模式如何工作?

    阻塞模式是否将该特定任务置于 进程等待 状态 因为我认为非阻塞套接字需要用户明确的 忙等待 或 自旋锁 实现 或者阻塞模式套接字只不过是内核忙等待的隐式实现 在信号量 互斥体 监视器等锁定机制中 通常通过将任务推入阻塞状态来实现锁定 我认为
  • Zapier:修改 webhook 侦听器 HTTP 响应?

    某些 API 需要 Webhook 侦听器响应中的附加信息 例如 我正在尝试订阅 Outlook com 的推送通知服务 该服务描述了以下流程 Outlook 通知服务尝试使用侦听器服务验证通知 URL 它在验证请求中包含验证令牌 如果侦听
  • Google REcaptcha 未显示

    我的中有以下内容 div class g recaptcha 这在我的 但无论是在 Firefox 还是 Chrome 上都没有显示任何内容 这是一个已知问题吗 确保是 head 标签关闭之前的最后一件事 这为我解决了同样的问题 div
  • 工具提示问题,MatTooltip 在 Angular 中不起作用

    我正在尝试在仪表板页面中插入通知工具提示 但该工具提示不起作用 我对 Angular 非常陌生 因此任何有关此问题的线索都将受到高度赞赏 module ts import MatTooltipModule from angular mate
  • find 命令仅搜索非隐藏目录

    在以下命令中 我只想搜索非隐藏的目录 如何使用以下命令执行此操作 我想在搜索日志文件时忽略隐藏目录 find home tom project name log txt ls home tom project dir1 dir2 backu
  • JAXB 绑定嵌套元素

    我正在使用 JAXB impl 我需要能够将嵌套元素作为简单类型映射到类字段 例如
  • 在 JavaScript 中使用 for..of 迭代时从数组中删除元素应该是安全的吗?

    我知道它适用于Set 但我的印象是它也可以与 Array 一起使用 所以我在 Chrome 中尝试了一下 很惊讶它不起作用 const array 1 2 3 4 5 6 for const item of array if item 3
  • 如何获取文件的文件类型

    有没有办法让VB net中的Windows资源管理器中显示的文件类型 例如 在 Windows 资源管理器的详细信息视图中可以看到 Name Date Modified Type Size A PDF 05 06 2017 5 54PM A
  • 无法访问生成配置管理器或 Visual C# 2010 Express 中的生成配置

    完整故事 通常 当我安装 Visual C 2010 Express 时 我做的第一件事就是切换到专家设置 这使我可以访问构建配置以及相应的管理器 最近的安装似乎行为不当 我创建的第一个项目是 XNA 4 0 刷新 项目 我导入了一些旧代码
  • Cordova / Ionic - 从 InAppBrowser 下载文件

    场景是这样的 我在InAppBrowser中打开一个网站 用户结束那里的工作后 网站生成一个 pdf供用户下载 问题是pdf没有下载 它在浏览器 有没有办法让它从 InAppBrowser 下载 我目前正在开发一个 iOS 应用程序 因此该
  • Laravel APP_LOCALE 西班牙语

    在 Laravel 5 4 中 env I have APP LOCALE es APP FALLBACK LOCALE en APP LOCALE PHP es US and in config app php locale gt env
  • 如何将数据库路由器添加到 Django 项目

    我正在按照此处有关如何在一个 Django 项目中处理多个数据库的说明进行操作主题 数据库 多数据库 https docs djangoproject com en 2 1 topics db multi db 我已经创建了所需的两个路由器
  • 如何向 UITableViewCell 添加手势?

    我想为每个单元格添加点击手势UITableView编辑其中的内容 添加手势的两种方法是通过代码或通过情节提要 我都尝试过 但都失败了 我可以添加一个手势吗every表格中的单元格带有情节提要拖放功能 它似乎只向第一个单元格添加手势 在代码中
  • 一小时后如何删除本地存储?

    我的数据是对象 我使用本地存储 javascript 保存它 如下所示 localStorage setItem storedData JSON stringify data 我只想保留该数据 1 小时 因此 如果超过 1 小时 数据将被删
  • 将 std::function 绑定到不同对象实例的相同函数

    是否可以重新绑定 std function 以指向相同的函数但具有不同的对象实例 假设我有一个对象 它的 std function 绑定到另一个函数 但如果该对象被复制到另一个实例 我想将 std function 重新绑定到该新实例而不是
  • bash 中双方括号的含义[重复]

    这个问题在这里已经有答案了 At this 凯尔 布 兰特回答中的问题 https serverfault com questions 53577 linux bash syntax meaning of and the 构造被描述为 ba
  • 使用字符串类输入空格时出现 cin 问题

    我有以下代码 main cpp include