为啥不使用指针读取结构?
Posted
技术标签:
【中文标题】为啥不使用指针读取结构?【英文标题】:Why does not read in a Struct with a pointer?为什么不使用指针读取结构? 【发布时间】:2020-05-14 20:40:08 【问题描述】:我有这段代码,但由于某种原因,cin.get 没有为 p.name[i] 赋值。我不知道为什么,但 getline 也不起作用。我尝试只使用 cin.get(temp,30) 来读取温度,但这在 for 循环中不起作用。
#include <iostream>
#include <string>
using namespace std;
typedef struct echip
char name[30];
double price;
;
void read(echip* p, int n)
for (int i = 0; i < n; i++)
cout << "Name: ";
cin.get((p + i)->name, 30);
cin.ignore();
cout << (p + i)->name;
cout << "Price: "; cin >> (p+i)->price;
cout << (p+i)->price;
int main()
echip* k;
int n;
cout << "Number: "; cin >> n;
k = new echip[n];
read(k, n);
delete[] k;
return 0;
【问题讨论】:
如果包含<string>
标头,为什么要使用 C 字符串?我认为您的代码不能被其他人编译。使用了citire()
,但未显示。你甚至没有调用你显示的读取函数。
如果你想要一个固定长度的结构是有意义的
我认为citire
== read
- 但不确定。
@ErwanDaniel 那我该怎么办?写 echip* [10]?
当p[i].name
更容易阅读时,避免使用(p + i)->name
。您还可以在每次迭代时提前使用p
指针,也可以执行p->name
。更好的是:在 const std::vector<echip>& echips
参数上使用 std::vector<echip>
和 for (auto& echip : echips)
。
【参考方案1】:
将cin.ignore()
放在cin.get()
之前:
Live demo
#include<limits>
//...
for (int i = 0; i < n; i++)
cout << "Name: ";
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //here
cin.get((p + i)->name, 30);
cout << (p + i)->name;
cout << "Price: ";
cin >> (p+i)->price;
cout << (p+i)->price;
cin.get()
与带有运算符 >>
的 cin
不同,不会忽略换行符。
我认为需要提及的其他一些小问题:
在 C++ 中,struct
s 不需要是 typedef
'd。
C++ 有标准容器,在这种情况下可以使用标准容器来代替 C 风格的容器 std::string
将是一个不错的选择。
Using namespace std;
is not considered a good practice.
【讨论】:
这些我都知道。我使用 typdef 是因为我认为这样我可以解决它。 @Pilv,哦,我明白了,很高兴看到您在询问之前尝试解决它,这实际上是网站指南的一部分,无论如何,如果您不介意我会保留小问题部分,以便未来的读者可以从这篇文章中学习并全面完成答案。【参考方案2】:在输入数字后执行cin.ignore()
。
cout << "Number: "; cin >> n; cin.ignore();
和
cout << "Price: "; cin >> (p+i)->price; cin.ignore();
不要在get
或getline
之后使用cin.ignore()
。
最好还是不要把get/getline和>>混在一起,这样你就完全不用忽略了。
【讨论】:
@Pilv 但是如果你真的想读行,使用getline,不要使用>>。读取一行,如果需要数字,则将该行转换为数字。以上是关于为啥不使用指针读取结构?的主要内容,如果未能解决你的问题,请参考以下文章