如何正确使用cin.peek()

2023-11-23

该函数应该读取一个分数并将其放入数组中。如果用户输入“0”,该函数应该退出。我尝试使用 cin.peek() 函数来执行此操作,但执行始终进入 if 语句并且不允许用户退出。

我应该如何正确编码(我愿意不使用 peek(),我认为这是最简单的方法。)

Thanks!

void enterFrac(Fraction* fracs[], int& index)
    {
        int n, d;
        char c, slash;
        cout << "Enter fractions (end by entering a 0): ";
        c = cin.peek();

        if ( c != '0')
        {
            cin >> n >> slash >> d;
            Fraction* f = new Fraction();
            f->num = n;
            f->den = d;
            fracs[index] = f;
            index++;
        }
    }

然而 peek() 的这个测试是有效的:

#include <iostream>
using namespace std;

int main () {
  char c;
  int n;
  char str[256];

  cout << "Enter a number or a word: ";
  c=cin.peek();

  if ( (c >= '0') && (c <= '9') )
  {
    cin >> n;
    cout << "You have entered number " << n << endl;
  }
  else
  {
    cin >> str;
    cout << " You have entered word " << str << endl;
  }

  return 0;
}

您的使用有两个问题std::istream::peek():

  1. 该函数访问下一个字符并执行not跳过前导空格。您可能想在确定下一个字符是什么之前跳过前导空格,例如使用操纵器std::ws: (std::cin >> std::ws).peek().
  2. 结果来自std::istream::peek()不是一个char。相反,它是一个std::char_traits<char>::int_type(这是一个奇特的拼写int)。结果可能是,例如std::char_traits<char>::eof()如果'0'碰巧是负面的(我不知道它在哪里的任何平台;但是,例如,我名字中的有趣角色'ü'在平台上是负值char已签名)您也不会得到正确的结果。也就是说,您通常比较的结果std::istream::peek()反对的结果std::char_traits<char>::to_int_type(),也就是说,你会使用这样的东西:std::cin.peek() == std::char_traits<char>::to_int_type('0')

也就是说,您的程序不会检查是否可以成功读取由斜杠分隔的分子和分母。你always想要验证读取是否成功,例如,使用类似

if ((std::cin >> nominator >> slash >> denominator) && slash == '/') {
    ...
}

只是为了娱乐,您可以创建一个操纵器来测试字符是否是斜杠,实际上:

std::istream& slash(std::istream& in) {
    if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type('/')) {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}

这样,您就可以封装斜杠测试。如果您需要在多个地方使用它,这非常方便。

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

如何正确使用cin.peek() 的相关文章

随机推荐

  • 在.NET中生成PDF文件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在使用 C NET 2 0 我想生成一个 PDF 文件 我应该在文件中写一段文字 生成PDF需要满足哪些先决条件 任何简单的编码示例都会对我有帮
  • jQuery 文件上传在 IE 8 和 9 中不起作用

    此代码适用于 FF 和 chrome 在 IE 8 或 9 中 我收到 500 错误 指出非空属性为空 这是html div class fileupload buttonbar div
  • `f()` 和 `new f()` 有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 中的 new 关键字是什么 从 JS 闭包创建对象 我应该使用 new 关键字吗 看这段代码 function friend name return name name var
  • 使用jQuery获取url并提取url段

    在具有类别列表的网页上 每个类别标题都按以下格式链接 http localhost admin category unpublish 2 我编写了以下js代码 试图捕获url和段 unpublish action 和 2 id 并且需要将请
  • Windows 和 Linux 上 fopen 中“r+”的使用

    我正在摆弄一些打开 读取和修改文本文件的代码 一个快速 简化 的例子是 include
  • Vue.js 通过单击按钮打开模式

    如何使用按钮在其他组件中显示模态框 例如 我有以下组件 info vue
  • sklearns OMP 中的“字典中的线性相关性”异常

    我正在使用 sklearns正交匹配追踪使用由学习者学习的字典来获得信号的稀疏编码KSVD算法 但是 在拟合期间我收到以下运行时警告 usr local lib python2 7 dist packages sklearn linear
  • MSBuild ItemGroup 包含/排除模式问题

    问题 未根据排除属性中传递的值正确构建 ItemGroups 数组 如果您运行此脚本 它会创建一些示例文件 然后尝试根据包含 排除属性创建一个名为 TheFiles 的数组 问题是当排除不是硬编码或非常简单的属性时 它会出错 目标 Dyna
  • 如何使用 Web API 返回文件?

    我在用ASP NET Web API 我想从 API API 生成的 使用 C 下载 PDF 我可以让 API 返回一个byte 对于 C 应用程序 我可以这样做 byte pdf client DownloadData urlToAPI
  • 如何从 Android 应用程序打开 Viber 公共聊天

    我知道如何在 Viber 中与某个号码打开对话 如何从 Android 应用程序 新版本 发起 Viber 通话 但是如何打开公共聊天呢 有任何想法吗 提前致谢 这段 Kotlin 代码对我来说效果很好 val viberPackageNa
  • Cordova 地理定位插件在 Android 上返回空位置对象

    我在使用 Geolocation Cordova 插件 org apache cordova geolocation 时遇到了一些问题 它在 iOS 上运行良好 但在 Android 上则完全不行 据我了解 该插件曾经包含本机 Androi
  • 使用 URL 检查远程服务器上是否存在文件 [重复]

    这个问题在这里已经有答案了 如何在 Java 中检查文件是否存在于远程服务器 由 HTTP 提供服务 上并具有其 URL 我不想下载该文件 只需检查它是否存在 import java net import java io public st
  • 拓扑排序 python

    我为 DFS 非递归编写了一个解决方案 但我无法修改它以进行拓扑排序 def dfs graph start path stack start while stack v stack pop if v not in path path ap
  • 将原生 ES6 Promise 与 MongoDB 结合使用

    我知道 Mongo 的 Node 驱动程序可以是许诺的使用外部库 我很好奇 ES6 Promise 是否可以与MongoClient connect 所以我尝试了这个 使用 Babel 5 8 23 进行转译 import MongoCli
  • 返回 JsonResult 导致 500 内部服务器错误

    我正在使用 jQuery 的 getJSON 函数返回一个JsonResult从我的控制器 jQuery getJSON Test GetJsonWFA null function data data each function alert
  • Elasticsearch,获取平均文档长度

    在elasticsearch中是否有更好的方法 除了发出匹配所有查询并手动平均所有返回文档的长度 来获取特定索引的平均文档长度 The size 映射字段 如果启用 应该免费为您提供每个文档的大小 将此与avg聚合应该能让你得到你想要的 就
  • 如何用常量值初始化 JavaScript 数组?

    如何使用常量值初始化 JavaScript 数组 例如 在 C 代码中我可以写 int array 1 2 3 JavaScript 中的等价物是什么 1 常规 var myCars new Array myCars 0 Saab myCa
  • 如何通过引用两个单元格自动命名电子表格?

    我刚刚编写完一个用于自动生成报告的漂亮宏 它运行良好 但我需要它根据两个单元格中的数据自动命名电子表格 本质上 该宏创建一个新的电子表格 将信息复制到其中 并创建每月所需的相关数据透视表 作为此过程的一部分 我创建了一个仪表板 用于生成报告
  • django admin 的有效用例?

    我想建立一个 django 网站 其中一组受信任的用户可以编辑他们的个人资料信息 让每个受信任的用户都通过 django 管理界面有意义吗 我只希望他们能够查看和编辑自己的信息 显然 这似乎不符合 django 人们定义 信任 的方式 尤其
  • 如何正确使用cin.peek()

    该函数应该读取一个分数并将其放入数组中 如果用户输入 0 该函数应该退出 我尝试使用 cin peek 函数来执行此操作 但执行始终进入 if 语句并且不允许用户退出 我应该如何正确编码 我愿意不使用 peek 我认为这是最简单的方法 Th