使用C ++中的字符指针将字符串保存到类属性

时间:2015-03-30 04:41:51

标签: c++ pointers io

我很难尝试使用cin接受输入,将它们保存到一些变量,然后构建一个类。当我输入第一个输入时,程序无限循环而不是等待下一个输入,而是一遍又一遍地显示提示。

课程是:

class person {
public:
    char *name;
    char *email;
    int phone;
    // constructor that uses the parameters to initialize the class properties
    person(char *cName, char *cEmail, int iPhone) {
        name = new (char[32]);  // acquiring memory for storing name
        email = new (char[32]);     // acquiring memory for storing email
        strcpy(name, cName);        // initialize name
        strcpy(email, cEmail);  // initialize email
        phone = iPhone;         // initialize phone
    }
    virtual ~person() {
        delete[] name;
        delete[] email;
    }
};

输入和构造函数调用如下:

char* nameIn = new (char[32]);  // acquiring memory for storing name
char* emailIn = new (char[32]);
int iPhoneIn;

cout << "Enter name, email, and phone:\n";

    cin >> *nameIn;
    cin >> *emailIn;
    cin >> iPhoneIn;

person* newPerson = new person(nameIn, emailIn, iPhoneIn); //create node

1 个答案:

答案 0 :(得分:2)

您可以通过几种方式修复/改进代码。

首先,我们从明显的错误开始。当您从cin读取输入时,请不要取消引用(调用*运算符)您的角色指针( char * )。 cin应该收到 char * ,而不是 char 。如果你传递一个 char ,它只会写你输入的第一个字符。因此,如果要输入字符串,则需要传递 char *

cin >> *nameIn; // this should be: cin >> nameIn;
cin >> *emailIn; // this should be cin >> emailIn;

使用和不使用建议的更改运行此代码段以查看我的意思:

#include <iostream>
using namespace std;
int main()  {
    cout << "Input a string: ";
    char * c = new(char[200]);
    cin >> *c; // only writes the first input character. Change to: cin >> c;
    cout << "You input: " << c; // prints the first input character then garbage
    delete[](c);
    return 0;
}

其次,不代表整数的电话号码。 int phone;无法使用标准的10位数电话号码。在大多数平台上,可以用整数表示的最大值约为21亿。大多数10位数字大于21亿。请改用字符数组。相应地调整输入法。

第三,不要不必要地动态分配内存。如果您从一开始就知道所有名称都适合32个字符,那么请将它们声明为。

char *name; // change to char name[32];
char *email; // change to char email[32];

这样可以更快地运行并为您节省必须释放已分配内存的痛苦。您将能够完全删除析构函数。