【问题标题】:Pointers to structures - having trouble understanding specific fragments of code指向结构的指针 - 无法理解特定的代码片段
【发布时间】:2012-08-20 08:24:29
【问题描述】:

代码如下:

// pointers to structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
};

int main ()
{
  string mystr;

  movies_t amovie;
  movies_t * pmovie;
  pmovie = &amovie;

  cout << "Enter title: ";
  getline (cin, pmovie->title);
  cout << "Enter year: ";
  getline (cin, mystr);
  (stringstream) mystr >> pmovie->year;

  cout << "\nYou have entered:\n";
  cout << pmovie->title;
  cout << " (" << pmovie->year << ")\n";

  return 0;
}

取自http://www.cplusplus.com/doc/tutorial/structures/。我希望我能澄清一些事情。

  1. 什么是getline,它是如何工作的?我尝试查找文档,但我仍然无法理解。另外,cin 到底是什么?它是如何与getline 一起使用的?

  2. 如果我理解正确,pmovie-&gt;title 本质上是说pmovie 指向对象title 的成员title?如果是这样,并且从对#1 的解释中还不清楚,getline (cin, pmovie-&gt;title) 是如何工作的?

  3. 现在这个(stringstream) mystr &gt;&gt; pmovie-&gt;year 给我带来了最大的麻烦。什么是stringstream,我们是否像将双精度类型转换为整数一样使用它?

谢谢大家!

【问题讨论】:

    标签: c++


    【解决方案1】:

    什么是 getline,它是如何工作的?我尝试查找文档,但我仍然无法理解。另外,cin 到底是什么,它是如何与 getline 一起使用的?

    getline 函数从istream 中读取一行。 cin 流是指您的标准输入流,通常是您从中获取输入的流。它被传递给getline 以告诉它从哪个输入流获取一行。

    如果我理解正确, pmovie->title 本质上是说 pmovie 指向对象 amovie 的成员标题?如果是这样,并且从对 #1 的解释中还不清楚,getline (cin, pmovie->title) 是如何工作的?

    getline 函数从cin 中读取一行并将其存储在通过引用传递的pmovie-&gt;title 中。

    现在这个 (stringstream) mystr >> pmovie->year 给我带来了最大的麻烦。什么是 stringstream,我们是否像将 double 转换为 int 一样使用它?

    stringstream 是一个使字符串像流一样的类。这是一种令人困惑的语法(C 风格的转换),这使得理解它正在发生的事情变得有点困难。基本上,使用mystr 的内容创建并初始化一个临时的stringstreamstringstream,当用字符串初始化时,会为您提供一个流,您可以从中读取这些内容。 &gt;&gt; 运算符从输出流中读取,在本例中为 pmovie-&gt;year,它再次通过引用传递。

    顺便说一句,在我看来,您似乎是在尝试理解异常复杂和令人困惑的用途,而尚未了解这些对象的更基本用途。这是一种非常难学的方法。

    【讨论】:

      【解决方案2】:

      大多数问题似乎根本与结构无关。所以,我正在解决与标题相关的问题,而不是关于流的问题:

      如果我理解正确的话, pmovie->title 本质上是说 pmovie 指向对象 amovie 的成员标题?如果是这样,并且从对 #1 的解释中还不清楚,getline (cin, pmovie->title) 是如何工作的?

      你误会了。我猜,这是你困惑的根源:pmovie 指向一个movies_t 对象。碰巧的是,在示例代码中,它被初始化为指向名为 amoviemovies_t 对象。

      现在,每个 movies_t 对象都有两个成员,即子对象:titleyear。要访问由指针指向的movies_ttitle 组件,请使用pmovie-&gt;title。要访问 year 组件,您可以使用 pmovie-&gt;year

      不过,关于流,我要说的一件事是:在假设读取成功之前,您应该始终检查输入是否成功。例如,您将使用

      检查读取一行是否成功
      if (std::getline(std::cin, pmovie->title)) {
          // deal with a successfully read title
      }
      

      【讨论】:

        【解决方案3】:
        1. cin 是由 C++ 定义的特殊流,用于处理标准输出(通常是键盘,但几乎可以是任何东西)。 getline 是一个函数,允许您从流中读取文本到缓冲区,直到遇到平台的行尾(UNIX 上的换行,Windows 和 DOS 的回车换行)。
        2. pmovie-&gt;title 表示pmove 是一个指向具有名为title 的成员的结构的指针。这是指那个成员。因为getline 接受string&amp;(字符串引用),所以它很乐意接受pmovie-&gt;title 引用的字符串。
        3. stringstream 定义了一个将strings 转换为stringstreams 的隐式构造函数。 &gt;&gt; 运算符从字符串中获取输入并将其转换为目标类型(&gt;&gt; 右侧的操作数类型)并将其放在那里。这只是将字符串转换为整数的一种方式。

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 2015-02-21
          • 2018-09-04
          • 2020-12-01
          • 1970-01-01
          相关资源
          最近更新 更多