如何从指向结构的指针输出char数组中的整个字符串

时间:2014-07-21 11:13:16

标签: c++ pointers

害羞地问,但我无法弄清楚为什么我只输出guests->name中的第一个字符?如何打印整个字符串?

#include <iostream>
using namespace std;

struct name_table {
    char name[20];
};

int main(){
    name_table *guests = new name_table;
    cout << "Please enter the the line:";
    cin.get(guests->name, 20);
    cout << "Okay, the line saved: " << *(guests)->name << endl;;

    cin.get();

    return 0;
}

谢谢

3 个答案:

答案 0 :(得分:2)

*(guests)->name
^^^^^^^^^^^^^^^
|^^^^^^^^^^^^^^
|      |
| guests->name
|      |
|  a char[20]
|      |
| becomes char*
| when passed into
|  operator<<
|
\
dereference

对指针应用解除引用会为您提供一个char

tl; dr:您正在打印一个字符。

你可以写:

guests->name

std::cin已经足够聪明,可以将char*视为C字符串,并逐个字符地迭代打印整个字符串。

但是,我会建议阅读std::string;在C ++中,您不需要乱用原始字符数组。此外,您有内存泄漏,动态分配是完全不必要的。

这就是我要做的事情:

#include <iostream>
#include <string>

int main()
{
   std::string name_table;
   std::cout << "Please enter the the line: ";
   std::getline(std::cin, name_table);
   std::cout << "Okay, the line saved: " << name_table << std::endl;
}

答案 1 :(得分:1)

guests是指向结构的指针。在您的输出*(guests)->name中,您同时使用*->运算符,其运算方式如下:

  • (guests)->name首先访问指针name后面的对象的guests成员。括号被忽略/可选。

  • 然后使用char运算符取消引用如此获得的*数组,从而导致单个char

所以你真正想要的是以下之一:

  • 删除*,并删除括号 guests->name,就像您在cin.get行中所做的那样。

  • 或者将*放在括号中以取消引用guests,然后使用.运算符(而不是->来访问该成员:{{1 }}

答案 2 :(得分:0)

你必须在你的计数行中删除*。

cout << "Okay, the line saved: " << (guests)->name << endl;