0

这是代码:

// 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->title基本上是说pmovie指向title对象的成员amovie?如果是这样,并且从对#1的解释中还不清楚,它是如何getline (cin, pmovie->title)工作的?

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

谢谢你们!

4

3 回答 3

2

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

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

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

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

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

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

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

于 2012-08-19T23:45:16.910 回答
1

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

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

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

现在,每个movies_t对象都有两个成员,即子对象: atitle和 a year。要访问指针指向的title组件,请使用. 要访问该组件,您可以使用.movies_tpmovie->titleyearpmovie->year

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

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