显示类变量。在printf函数中使用string作为参数。

时间:2012-08-07 08:06:58

标签: c++

我正在试图弄清楚课程是如何工作的,但我遇到了一些麻烦

的main.cpp

#include <stdio.h>
#include "Student.h"
#include <stdlib.h>

void main()
{
Student students;

students.Print();

system("pause");

}

Student.h

#pragma once
#include <string.h>
#include <iostream>
using namespace std;

class Student
{
public:
    Student(void);
    ~Student(void);
    void Print(void);
private:
    int IDone;
    int IDtwo;
    string studentOne;
    string studentTwo;
};

Student.cpp

#include "Student.h"

Student::Student(void)
{
    studentOne = "John Doe";
    studentTwo = "Jane Doe";
    IDone = 227768;
    IDtwo = 227769;
}

Student::~Student(void)
{
}
void Student::Print(void)
{
    printf("Student name: %s\n", studentOne);
    printf("Student ID: %d\n", IDone);
    printf("Student name: %s\n", studentTwo);
    printf("Student ID: %d\n", IDtwo);

}

当这个运行时,我得到:

    Student name: <null>
    Student ID: 227768
    Student name: <null>
    Student ID: 227769

后来我希望能够更改名称和ID。此外,可以将这些成员放在一个数组中,这样我就可以通过学生[0]和学生[1]来打印它?

5 个答案:

答案 0 :(得分:4)

阅读有关std::string的参考资料,您将找到一个名为c_str的方法,该方法用于获取可在例如{3}中使用的C风格字符指针。 printf

或者只是开始使用std::cout

void Student::Print(void)
{
    std::cout << "Student name: " << studentOne << '\n';
    std::cout << "Student ID: " << IDone << '\n';
    std::cout << "Student name: " << studentTwo << '\n';
    std::cout << "Student ID: " << IDtwo << '\n';
}

答案 1 :(得分:1)

你需要使用像vector这样的stl容器而不是数组来存储你的学生细节,你应该将你的学生班级改造成这样的东西

class Student
{
private:
 string Name;
 int    Id;
public:
 Student(string name, int id);
 string GetName();
 void SetName(name);
 int GetId();
 void SetId(int id);
 void Print();
};

你的主要应该是这样的

   void main()
    {
      vector<Student> studentList;

      Studen one("John Doe", 1);
      Studen two("Jane Doe", 2);

      studentList.push_back(one);
      studentList.push_back(two);

      vector<Student>::const_iterator cii;
      for(cii=Student.begin(); cii!=Student.end(); cii++)
       {
          *cii.Print();

       }

    }

答案 2 :(得分:0)

printf("Student name: %s\n", studentOne);

导致未定义的行为。您需要传递一个适合%s格式说明符的c样式字符串,即studentOne.c_str()

  

可以将这些成员放在一个数组中,这样我就可以   通过学生[0]和学生[1]

打印出来

您始终可以将std::string数组声明为任何其他数据类型。

class Student
{
  ...
  string students[N];  // or vector<string> students;
};

答案 3 :(得分:0)

printf("Student name: %s\n", studentOne);

您无法将C ++ std::string传递给C printf函数;你只能传递与C语言共享的基本类型;传递类类型将导致未定义的行为。

您可以使用C ++输出:

std::cout << "Student name: " << studentOne << std::endl;

或者,如果你真的想出于某种原因使用C输出,你可以从std::string中提取C风格的字符串:

printf("Student name: %s\n", studentOne.c_str());
                                       ^^^^^^^^
  

另外,可以将这些成员放在一个数组类型中,这样我就可以通过学生[0]和学生[1]来打印它?

是的,您可以将大多数类型(包括类)放在数组中:

std::string student[2]; // array of two strings.

如果需要变量编号,请使用动态数组:

std::vector<std::string> student;

但是,单个Student有两个名称和两个ID似乎有点奇怪。那个班不应只代表一个人吗?

答案 4 :(得分:0)

  

另外,可以将这些成员放在一个数组类型中,这样我就可以通过学生[0]和学生[1]来打印它?

不确定。如果您事先了解学生人数,那么您可以:

string students[2];

此语句将在内存中有效分配两个string对象,您可以通过数组索引引用它们。

如果您不知道您需要多少学生,那么最好使用std::vector类,因为它是在C ++中表示动态数组的首选方式。

您将studentOne,studentTwo,IDOne和IDTwo数据成员放在您的类声明的私有部分下。这意味着您只能在Student类实现中直接操作它们。大多数其他程序员希望您遵循的方法是创建特殊的getter和setter方法:

const std::string& studentOne() const {return studentOne;}
void setStudentOne(const std::string& aStudentOne) {studentOne = aStudentOne;}

等等。当您想要产生一些副作用时,创建setStudentOne特别有用。否则,您可以使用单一方法来访问它:

std::string& getStudentOne() {return studentOne;}

或者,公开对字段的直接访问(即将它们重定位到公共部分下)不是禁忌。请记住,这不是大多数人所期望的。