基本字符串输入

2024-02-09

我刚刚遇到了这段代码,它允许用户在命令提示符中输入字符串。我知道他们所做的一切,这一切都很棒。但我有一个关于 cin 和 getline() 函数的问题。

string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;

现在,当这是输出时,我得到如下内容:(使用 john smith 作为输入)

Please enter your full name: john smith
Welcome John
Please enter your full name again: That's better thanks Smith

我明白为什么会发生这种情况,getline 仍在从输入缓冲区读取,我知道如何修复它。我的问题是,为什么“请再次输入您的全名:”之后没有换行符?当我将代码更改为:

string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
cin.ignore( 256, '\n') ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;

当你再次输入你的全名后,我突然收到换行符。老实说,这并不是一个大问题。但如果有人能帮助我,我不介意知道发生了什么。谢谢!


你看,当你首先输入“John Smith”作为输入时cin >> name不会读取整行,而是读取该行的内容,直到第一个空格。

所以,在第一个之后cin,名称变量将包含John。还是会有Smith\n在缓冲区中,您已经使用以下方法解决了这个问题:

cin.ignore( 256, '\n') ;

Note:正如 Konrad Rudolph 建议的那样,您确实不应该在代码中使用 256 或任何其他魔术数字。而是使用std::numeric_limits<std::streamsize>::max()。这是文档关于第一个参数的说明istream::ignore:

要提取(和忽略)的最大字符数。如果这正是numeric_limits<streamsize>::max(),没有限制:根据需要提取尽可能多的字符,直到找到 delim(或文件结尾)。

cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n') ;

我的问题是,为什么“请再次输入您的全名:”之后没有换行符?

因为您没有将 1 输出到标准输出,并且用户没有机会按 Enter 键。getline会读Smith\n从缓冲区中取出,它将立即继续。它不会将任何换行符回显到您的控制台 -getline不这样做。

当你再次输入你的全名后,我突然收到换行符。老实说,这并不是一个大问题。但如果有人能帮助我,我不介意知道发生了什么。谢谢!

这是换行符user输入与Enter关键,它不是来自您的程序。

Edit在终端中按 Enter 键通常(取决于终端设置)会执行一些单独的操作:

  1. 插入\n进入输入缓冲区
  2. 刷新输入缓冲区
  3. 将输入光标向下移动一行
  4. 将输入光标移动到行首
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本字符串输入 的相关文章

随机推荐

  • asp.net MVC - 如何制作主页面/详细信息页面

    我希望创建一个主 详细信息页面 我认为它以两种方式之一工作 单击网格中的一行会再次调用同一页面 并添加详细信息面板 单击一行会对控制器操作进行 javascript JSON 调用 该操作返回详细信息并填充面板 我希望突出显示所选行 所选行
  • 可以将输入字符串转换为Python中的可调用函数对象吗? [复制]

    这个问题在这里已经有答案了 我希望能够获取一个描述 Python 函数的字符串 并将其转换为一个我可以调用的函数对象 例如 myString def add5 x return x 5 myFunc myString toFunction
  • 使用 Python 的 Dataflow/Beam 示例

    我正在尝试获取以下项目的样本PCollection在 Dataflow Beam 上使用 Python SDK 虽然没有记录 Sample FixedSizeGlobally n 存在 测试时 它seems返回一个PCollection包含
  • 未找到类 Android 支持设计小部件 NavigationView

    美好的一天 你能帮我一个忙吗 在模拟器上编译 运行代码时出现此错误 这是我以前制作的示例教程 我使用了 min Target API 15 并编译了最新的 gradle com android support design 23 0 0 h
  • 当初始状态和最终状态相同时,不会触发transitionend

    在下面的例子中我正在做background color使用 CSS 进行过渡并尝试处理transitionend两个 div 的事件 很遗憾 transitionend没有被解雇div2因为初始和最终背景颜色相同 var div1 div1
  • ASP.NET WebAPI 默认登陆页面

    我已经使用 ASP NET WebApi v2 创建了一个 RESTful Web 服务 并且正在使用虚张声势 https github com domaindrivendev Swashbuckle为 API 文档生成 swagger U
  • 使用 C# 反射从字典生成动态对象

    我一直在研究 C 中的反射 想知道我是否使用带有键值的字典可以创建一个带有变量的对象 该变量包含字典中每个键的名称及其值 该字典的键值 我有一个相反的方法 它从字典中提取一个对象 该字典包含键和类属性及其值 即属性的值 我想知道如果可能的话
  • Julia 中加载/导入的包列表

    如何获取 Julia 会话导入 使用的包的列表 Pkg status 列出所有已安装的软件包 我对通过以下方式导入 加载的内容感兴趣using or import 看起来whos 包含相关信息 名称以及是否是模块 可以输出whos 被捕获在
  • jQuery every 循环重命名 ID 的每个实例

    我有一个页面正在表中创建动态创建的行 其输入的 ID 为 fixedRate 我正在尝试重命名fixedRate id 的每个实例 这仅适用于我当前代码的 id 的第一个实例 这是代码 var amountRows billTasks gt
  • 析构函数永远不会被调用[重复]

    这个问题在这里已经有答案了 我有课Class这创造了一个Thread在它的构造函数中 该线程运行一个while true 循环正在读取非关键数据NetStream 该线程将被析构函数中止 Class thread Abort thread
  • 进程是否在远程计算机上运行?

    我有三台远程连接的远程电脑 我正在尝试编写一个简单的 Windows 应用程序 该应用程序将在单个窗口中显示特定进程是否在任意一台机器上运行 例如 Server1 Chrome 未运行 Server2 Chrome 正在运行 Server3
  • 为 Android 创建 PDU

    我目前正在编写和应用程序 即发送 接收短信 出于单元测试的目的 我需要以编程方式创建 PDU 解码非常简单 Bundle bundle intent getExtras if bundle null Get all messages con
  • 有人尝试过用Z3本身来证明Z3吗?

    有没有人尝试证明Z3 http research microsoft com en us um redmond projects z3 与Z3本身 是否有可能使用 Z3 来证明 Z3 是正确的 更理论化的是 是否有可能使用 X 本身来证明工
  • 模型不会在 ng-if 内更新

    我在角度应用程序中遇到了奇怪的行为 我不知道这是一个错误还是已知的限制 use strict var ctrl function scope scope foo false div foo foo div style background
  • 使用另一个表中的数据创建 SQL 表

    如何使用另一个表 表的副本 中已存在的数据创建表 复制表的最便携方法是 使用 CREATE TABLE 语句创建新表 基于旧表中的 SELECT 使用 INSERT INSERT INTO new table SELECT FROM old
  • 以类似于 Windows 的 MessageBox() 的方式使用 UIAlertView?

    我是 iPhone 新手 我希望能够以类似于 Windows 的方式使用 UIAlertViewMessageBox or the MessageDlg in Delphi 例如 我有一个方法需要询问用户对某件事的确认 并根据他们的响应继续
  • 仅返回与 Solr 匹配足够 NGram 的结果

    为了使用 Solr 实现某种程度的容错 我开始使用NGramFilterFactory 以下是来自schema xml
  • RegAsm.exe 和 regsvr32 有什么区别?如何使用regsvr32生成tlb文件?

    谁能告诉我 regsvr32 和 RegAsm 之间有什么区别 我的 Dll 是 C 语言 那么如何将类导入到 C 中 regsvr32将加载库并尝试调用DllRegisterServer 从那个图书馆 它不在乎什么DllRegisterS
  • PostgreSQL 与 SQL Server NVARCHAR 等效的是什么?

    如果 Microsoft SQL Server 数据库中有 NVARCHAR 或 NTEXT 数据类型的字段 那么 PostgreSQL 数据库中的等效数据类型是什么 我很确定 postgres varchar 与 Oracle Sybas
  • 基本字符串输入

    我刚刚遇到了这段代码 它允许用户在命令提示符中输入字符串 我知道他们所做的一切 这一切都很棒 但我有一个关于 cin 和 getline 函数的问题 string name cout lt lt Please enter your full