c++ - `cin` 在 Mac 上错误地解析 `double` 输入

标签 c++ macos clang cin

一些背景知识 - 我是学习 C++ 的新手。我正在研究 Accelerated C++ 并进行后续操作。在第 4 章中,我得到的代码并不像书上建议的那样有效,我已经仔细检查了我所有的代码以确保我没有从他们的示例中输入错误的东西(我不能无论如何,请查看任何错误)。


我有以下结构和两个函数:

struct Student {
  std::string        name;
  double             midtermGrade, finalGrade;
  std::vector<double>homework;
};

std::istream& read(std::istream& is, Student& s) {
  is >> s.name >> s.midtermGrade >> s.finalGrade;

  std::cout << std::endl << "Name: " << s.name << std::endl
            << " - Md: " << s.midtermGrade << std::endl
            << " - Fn: " << s.finalGrade << std::endl;

  read_hw(is, s.homework);

  return is;
}

std::istream& read_hw(std::istream& in, std::vector<double>& hw) {
  if (in) {
    hw.clear();

    double h;

    while (in >> h) {
      std::cout << " - Hw: " << h << std::endl;
      hw.push_back(h);
    }

    in.clear();
  }

  return in;
}

int main() 中,我这样调用该代码:

Student record;
while (read(std::cin, record)) {

如果我编译并运行,然后粘贴(或键入)以下输入,我将得到以下输出:

// Input
Johnny 70 80 50 Fred 95 90 100 Joe 40 40 50

// Output
Name: Johnny
 - Md: 70
 - Fn: 80
 - Hw: 50

Name: red
 - Md: 95
 - Fn: 90
 - Hw: 100

Name: Joe
 - Md: 40
 - Fn: 40
 - Hw: 50

如您所见,“Fred”变成了“red”。我已经尝试了一大堆名字;以 A-F 开头的任何内容都受到相同问题的影响,这让我怀疑它可能是十六进制问题。但是,“Nick”变成了“k”,“Xander”变成了“r”。

我真的很困惑。你知道发生了什么事吗?


根据要求,这是一个 MCVE:

#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

struct Student {
  std::string        name;
  double             midtermGrade, finalGrade;
  std::vector<double>homework;
};

std::istream& read_hw(std::istream& in, std::vector<double>& hw) {
  if (in) {
    hw.clear();

    double h;

    while (in >> h) {
      std::cout << " - Hw: " << h << std::endl;
      hw.push_back(h);
    }

    in.clear();
  }

  return in;
}

std::istream& read(std::istream& is, Student& s) {
  is >> s.name >> s.midtermGrade >> s.finalGrade;

  std::cout << std::endl << "Name: " << s.name << std::endl
            << " - Md: " << s.midtermGrade << std::endl
            << " - Fn: " << s.finalGrade << std::endl;

  read_hw(is, s.homework);

  return is;
}

int main()
{
  Student record;

  std::vector<Student> students;

  while (read(std::cin, record)) {}

  return 0;
}

最佳答案

进一步研究后,libc++ 似乎没有以您希望的方式从 cin 中读取 double 值。我不确定它是否只是专门的 double ,但我认为它可能是。它似乎只影响 OSX 上的 Clang 编译器,而且它真的很烦人:P

对于 TL;DR 版本,请参阅我已接受的 David 的回答。

我目前不知道有任何好的修复它,但如果你添加编译器标志 -stdlib=libstdc++ 你可以强制它使用旧的,弃用的 stdlib 将按预期工作。显然它的功能较少(在我的示例中,缺少 std::sortstd::domain_error)。其他选项包括不使用 double 和对输入做进一步的解析(尽管我是 C++ 的新手,恐怕我没有关于那个的史酷比)。

相关阅读:

official bug report 3.5年前开的,到现在还没解决。

关于c++ - `cin` 在 Mac 上错误地解析 `double` 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44415197/

相关文章:

swift - OSX swift 3 - 无法禁用 keyDown。错误声音

c++ - 模板类的模板化构造函数的显式实例化

macos - 如何创建符号链接(symbolic link)以在 Mac osx 的终端中打开目录?

OSX Sierra 上的 MySQL 无法启动 : The server quit without updating PID file

c++ - Clang 和 C++11 header

c++ - 将 `nullptr` 分配给 `bool` 类型。哪个编译器是正确的?

c++ - vsnprintf 与 GCC 有 %s 段错误

c++ - 如何从 C++ 代码中获取项目名称?

c++ - 如何测量C math.h库函数的执行时间?

c++ - 为什么此 SSE2 代码执行不一致?