【问题标题】:Why does cin.getline assign to character array but using '=' will not?为什么 cin.getline 分配给字符数组但使用 '=' 不会?
【发布时间】:2012-11-12 22:51:27
【问题描述】:

例如,如果我从用户那里获取学生姓名并使用cin.getline(student.name, 50);,我可以分配学生姓名。我无法通过student.name = "John Doe"; 明确指定学生姓名,因为您不能只复制一个数组,但是为什么当我使用 getline 函数时这会起作用?有什么区别?不是getline()收集了一个字符数组然后复制到studnet.name吗?

为了澄清,我问为什么我可以使用cin.getline(student.name, 50) 分配学生姓名而不是stuent.name = "John Doe",这两种方法有什么区别(为什么getline() 有效而直接分配无效)。

【问题讨论】:

  • namechar 数组吗?如果是这样,数组是不可分配的,所以你不能写arrayname = "blah";。此外,除非您有充分的理由不这样做,否则您应该使用 std::string 而不是 char 数组。
  • @Praetorian 你的评论似乎是一个合适的答案,为什么不这样做呢?
  • 我不是在问如何分配char name[50] = "John Doe",我是在问为什么cin.getline(student.name, 50) 有效而直接分配无效。最后我问的是2之间有什么区别。
  • @Howdy_McGee basic_istream::getlinepointer 指向 char 数组并写入该指针指向的任何位置。该语言定义了从数组到指向数组第一个元素的指针的隐式转换,因此当您说cin.getline(student.name, 50) 时,指向name 成员第一个元素的指针将传递给getline。直接分配给数组不起作用,因为它没有在 C 或 C++ 中定义。
  • @user93353 我从来没有说过getline 能够在单个语句中对指针进行赋值,当然它必须逐个字符地完成。而且我不明白您为什么要谈论getline 在本地重新分配指针;我的评论清楚地表明写入指针指向的任何位置

标签: c++ arrays object variable-assignment getline


【解决方案1】:

请参阅以下 C 常见问题解答 - http://c-faq.com/aryptr/arrayassign.htmlhttp://c-faq.com/aryptr/arraylval.html

我在这里假设namechar name[something]

如果要分配,请使用 std::string 类型而不是 char array

改变你的

char name[50];

#include <string>
using std::string;

... ...

    string name;

... ...

现在您可以随意使用=

getline 之所以有效,是因为它在内部会做这样的事情

  • 读取一个字符。

  • 分配给名称[0]

  • 读取下一个字符。

  • 分配给名称[1]。

等等。

【讨论】:

  • 对我明白,如果我想使用字符串,但使用 getline 会将它从用户那里得到的任何东西分配给学生班级的char name[50],我的问题是为什么这样有效并且直接分配不.
  • getline 分别分配每个字符(在循环中),就像 strcpy 函数所做的那样。
  • @Howdy_McGee - 你检查了我回答中的 2 个常见问题链接吗?这将解释为什么不能直接分配 char 数组。 getline 有效,因为它不是直接分配。它是按字符分配的,就像std::string 一样。
  • 我做过,但觉得它不能肯定地回答我提出的问题。我觉得@Praetorian 的评论击中了答案。
  • @Howdy_McGee - 不是 Praetorian 的答案不正确。可以直接分配指针,但在这种情况下不相关。如果将指针直接分配给 getline 内部 - 那么这将是更改的指针的本地副本。您的代码永远不会看到指针分配的字符串。 getline 必须逐个字符地将字符串复制到指针指向的内存中。
【解决方案2】:

如果您查看istream::getline 函数istream&amp; getline (char* s, streamsize n ); 的参数列表,您会注意到它将您的变量student.name 作为指针。这允许 getline 直接写入 c-string 的内存位置。

编辑:有关更详细的解释,请参见 cmets 中 Praetorian 的回答。

【讨论】:

  • 哈,你刚刚总结了@Praetorian 的评论吗?
  • 哦,我没有看到他的评论,我会给他功劳。我记得上学期我学习 cin.getline 时也有同样的想法,哈哈。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多