我正在尝试使用原始字符表和STL做对象。
我已经搜索了大约 30 个关于同一主题的堆栈溢出问题,但它没有给我答案(我认为我没有能力阅读它们(。
因此,当我填写信息时它可以正常工作,但是在我尝试在控制台中打印它们后,它们给出了奇怪的字符:" ╠ ;╠ ;╠ ;²"我不知道为什么,这不是我最强的区域,我试图将char设置为NULL。
谢谢你,我很抱歉这个愚蠢的问题。
我的对象.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
我的对象.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];
}
我的主菜.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;
}
}
首先,这里绝对没有理由使用字符数组。 你的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
for std::string
停止在第一个空格处,因此需要使用 getline
重写,因为getline
不会在第一个空格字符处停止。
for (int i = 0; i < size; i++)
{
cout << "Name: ";
getline(cin, name);
cout << "Title: ";
getline(cin, title);
cout << "Phonenumber: ";
getline(cin, phonenumber);
cout << "Roomnumber: ";
getline(cin, roomnumber);
}
这应该是您需要的大部分更改。
这个构造函数是错误的,你把 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:"";
}