Char返回奇怪的输出C ++

时间:2014-12-13 14:10:15

标签: c++ oop vector char

我正在尝试用原始字符表和STL做对象。

我搜索了30个关于相同主题的stackoverflow问题,但它没有给我答案(我认为我无法阅读它们)。

所以当我填写信息时它工作正常,但在我尝试在控制台中打印它们之后,它们会给出奇怪的字符:“╠;╠;╠;²”我不知道为什么,这不是我最强的区域,我试图将char设置为NULL。

谢谢你,我很抱歉这个愚蠢的问题。

我的Object.h文件:

#ifndef Object_H
#define Object_H

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

class Object
{
    private:

    char Name[100];
    char Title[50];
    char Phonenumber[30];
    char RoomNumber[15];

    public:

    //default
    Object();

    //overload 
    Object(char, char, char, char);

    char getName() const;
    char getTitle() const;
    char getPhno() const;
    char getRoomnro() const;

    ~Object();

#endif

My Object.cpp

#include "Object.h"

Object::Object(){
    Name[100] = {0};
    Title[50] = { 0 };
    Phonenumber[30] = { 0 };
    RoomNumber[15] = { 0 };
}

Object::Object(char name, char title, char phonenumber, char roomnumber){
    Name[100] = name;
    Title[50] = title;
    Phonenumber[30] = phonenumber;
    RoomNumber[15] = roomnumber;
}

Object::~Object(){
}

//getterit
char Object::getName() const {
    return Name[100];
}

char Object::getTitle() const {
    return Title[50];
}

char Object::getPhno() const {
    return Phonenumber[30];
}

char Object::getRoomnro() const {
    return RoomNumber[15];
}

我的main.ccp

#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <iomanip>

#include "Henkilo.h"

using namespace std;

void objectFiller(vector<Object>&); 

void printObject(const vector<Object>&);

int main() {

vector<Object> ObjectList;

    objectFiller(ObjectList);

    printObject(ObjectList);
}

void objectFiller(vector<Object>& newObjectList){
        char name[100];
        char title[50];
        char phonenumber[30];
        char roomnumber[15];

        int size;

        cout << "How many people: "; cin >> size;

        for (int i = 0; i < size; i++)
        {
            cout << "Name: ";
            cin >> name;
            cout << "Title: ";
            cin >> title;
            cout << "Phonenumber: ";
            cin >> phonenumber;
            cout << "Roomnumber: ";
            cin >> roomnumber;

            Object newObject(name[100], title[50], phonenumber[30], roomnumber[15]);

            newObjectList.push_back(newObject);
            cout << endl;
};
        }
        cout << endl;
    }

    void printObject(const vector<Object>& newObjectList)
    {
        unsigned int size = newObjectList.size();

        for (unsigned int i = 0; i < size; i++){
            cout << newObjectList[i].getName() << " ; " << newObjectList[i].getTitle() << " ; " << newObjectList[i].getPhno() << " ; " << newObjectList[i].getRoomnro() << endl;
            cout << endl;
        }
    }

2 个答案:

答案 0 :(得分:1)

首先,绝对没有理由在这里使用字符数组。你的Object类不是一个简单的struct,所以可以使用的推理,即“我的结构需要与C兼容,所以我需要使用char数组”不适用。

因此,使用std::string,您的大多数问题都会消失。

#include <string>
class Object
{
    private:
        std::string Name;
        std::string Title;
        std::string Phonenumber;
        std::string RoomNumber;

    public:
        Object();

    //overload 
        Object(const std::string&, const std::string&, 
               const std::string&, const std::string&);

        std::string getName() const;
        std::string getTitle() const;
        std::string getPhno() const;
        std::string getRoomnro() const;
    };

请注意,Object构造函数通过引用获取4个std :: string。

然后使用此界面重写您的功能。

#include "Object.h"
using namespace std;    
Object::Object(){}

Object::Object(const string& name, const string& title, 
               const string& phonenumber, const string& roomnumber) :
               Name(name), Title(title), Phonenumber(phonenumber), 
               RoomNumber(roomnumber)
 {}

请注意,默认构造函数为空,因为默认情况下std :: string是空的。 4参数构造函数仅接受传入的字符串并使用信息初始化成员(注意使用initialization list

然后我们到达您的get...功能。原来的是错的。例如:

char Object::getName() const {
    return Name[100];
}

首先,返回类型为char,这意味着返回单个字符,而不是字符串。其次,您将返回位于Name[100]的字符,这是不正确的。前往位置100是一种超出界限的访问。

如果您的目标是返回数组Name,则无法在C ++中返回类似的原始数组。但是,让我们放弃所有这些并正确地重写它,因为我们正在使用std::string

std::string Object::getName() const { return Name; }

对其他get...函数进行相同的更改。

最后,您的输入需要更改。由于cin的{​​{1}}在第一个空格处停止,因此需要使用std::string进行重写,因为getline不会停留在第一个空格字符处。

getline

这应该是您需要的大部分更改。

答案 1 :(得分:0)

这个构造函数错误,你把4个字符作为参数并将它们分配到数组之外(名称[100]的有效索引是0..99)

Object::Object(char name, char title, char phonenumber, char roomnumber){
    Name[100] = name;
    Title[50] = title;
    Phonenumber[30] = phonenumber;
    RoomNumber[15] = roomnumber;
}

如果你想保留原生数组,那么你需要将字符串复制到它们中

Object::Object(char* name, char* title, char* phonenumber, char* roomnumber)
{
    strcpy(Name, name);
    strcpy(Title, title);
    strcpy(Phonenumber, phonenumber);
    strcpy(RoomNumber, roomnumber);
}

现在上面的解决方案仍有几个问题,例如,如果你将数组声明为字符串,它就会更灵活。

std::string Name;
std::string Title;
std::string PhoneNumber;
std::string RoomNumber;

构造函数可能看起来像

Object::Object(char* name, char* title, char* phonenumber, char* roomnumber)
{
    Name = (name != NULL)?name:"";
    Title = (title != NULL)?title:"";
    Phonenumber = (phonenumber!=NULL)?phonenumber:"";
    RoomNumber = (roomnumber!=NULL)?roomnumber:"";
}