【问题标题】:c++ program printing out address instead of valuec++程序打印出地址而不是值
【发布时间】:2020-10-11 22:18:12
【问题描述】:

我有一个程序通过结构接收信息并将其放入向量中,我试图将这些信息打印出来,而是获取一个地址。该结构应该正确地保存值,所以我认为它要么是我的指针,要么是我打印出来的方式。

#include <iostream>
#include <cstring>
#include<vector>

using namespace std;

struct student
{
  char* fName;
  char* lName;
  int id;
  float gpa;
};

void add(vector<student*>*);

int main() 
{
  vector <student*>* list = new vector<student*>();


    if (strcmp(cmd,"ADD") == 0)
    {
      add(list);  
    }
    else if (strcmp(cmd,"PRINT") == 0)
    {
      for(vector<student*>::iterator i = list->begin(); i != list->end(); i++)
      {
        cout << *i;
      }
      cout << "print" << endl;
    }
}
  void add(vector<student*>* paramlist)
  {
    student* s = new student();
    s->fName = new char[25];
    s->lName = new char[25];

    cout << "Enter first name" << endl;
    cin >> s->fName;

    cout << "Enter last name" << endl;
    cin >> s->lName;

    cout << "Enter id number" << endl;
    cin >> s->id;

    cout << "Enter GPA" << endl;
    cin >> s->gpa;

    paramlist->push_back(s);
  }

或者它可能与我遍历向量的方式有关。

【问题讨论】:

  • 您可能需要阅读此官方帮助页面,以了解为什么您的问题至少收到了一个反对票(不是来自我):How to create a minimal reproducible example
  • 你为什么要使用指针?您应该简单地使用std::vector&lt;student&gt; 而不是std::vector&lt;student*&gt;* 和std::string 而不是char*。这将立即使您的代码更简单、更安全并且没有内存泄漏
  • 很多额外的不应该出现的新表达式,这种风格会产生内存泄漏
  • @alterigel 对不起,这是一个学校项目,我必须使用指针。
  • @FaizanKarim vector&lt;student*&gt; 表示灾难,因为该向量不会释放分配给学生的内存,并且显然student 不会释放字符串。 void add(vector&lt;student*&gt;* paramlist) 不是 C++ 方式,除非您需要对指针进行操作,否则将是 void add(vector&lt;student*&gt;&amp; paramlist)

标签: c++ pointers vector


【解决方案1】:

您需要为结构添加运算符重载,以定义结构在打印时应如何显示。您还需要取消引用指针以及迭代器。

// Define how the struct should look when printed.
// This function makes it appear like:
// Name: John Smith, ID: 1235, GPA: 4.0
std::ostream &operator<<(std::ostream &os, const student &val) {
  os
    << "Name: " << val.fname << " " << val.lname
    << ", ID: " << val.id
    << ", GPA: " << val.gpa
    << endl;

  return os;
}

然后……

for(vector<student*>::iterator i = list->begin(); i != list->end(); i++)
{
  // Dereference twice, once for the iterator, and again for the pointer.
  cout << **i << endl;
}

【讨论】:

    【解决方案2】:

    您必须取消引用两次**i。 使用*i,您将获得vector 元素的地址,即student*。 你得到student,你需要其他*。

    您可以使用for (auto i: list) 让您的生活更轻松。

    【讨论】:

    • 问题是如果我把 2 * 然后我得到一个无效的二进制表达式 ostream 和 student 的操作数。
    • 您的解决方案是对的。但是*i 没有给出容器元素的地址。它是对容器元素的引用。而且由于这里的容器保存了指针,*i 是对指针的引用。
    • @Faizan Karim,因为你没有写ostream &amp;operator&lt;&lt;(std::ostream &amp;os, const student &amp;val)。
    猜你喜欢
    • 2014-05-17
    • 2016-02-26
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多