害羞地问,但我无法弄清楚为什么我只输出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;
}
谢谢
答案 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;