为啥不使用指针读取结构?

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;

【问题讨论】:

如果包含 &lt;string&gt; 标头,为什么要使用 C 字符串?我认为您的代码不能被其他人编译。使用了citire(),但未显示。你甚至没有调用你显示的读取函数。 如果你想要一个固定长度的结构是有意义的 我认为citire == read - 但不确定。 @ErwanDaniel 那我该怎么办?写 echip* [10]? p[i].name 更容易阅读时,避免使用(p + i)-&gt;name。您还可以在每次迭代时提前使用p 指针,也可以执行p-&gt;name。更好的是:在 const std::vector&lt;echip&gt;&amp; echips 参数上使用 std::vector&lt;echip&gt;for (auto&amp; 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() 与带有运算符 &gt;&gt;cin 不同,不会忽略换行符。

我认为需要提及的其他一些小问题:

在 C++ 中,structs 不需要是 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();

不要在getgetline 之后使用cin.ignore()

最好还是不要把get/getline和>>混在一起,这样你就完全不用忽略了。

【讨论】:

@Pilv 但是如果你真的想读行,使用getline,不要使用>>。读取一行,如果需要数字,则将该行转换为数字。

以上是关于为啥不使用指针读取结构?的主要内容,如果未能解决你的问题,请参考以下文章

使用指针符号从矩阵中读取数据

C语言 结构体指针字符 二进制文件写入和读取

JNR-FFI如何从指针读取结构数组

为啥 Apache Spark 会读取嵌套结构中不必要的 Parquet 列?

访问指向结构的指针会导致内存读取冲突

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?