Char 返回奇怪的输出C++

Char returns weird output C++

本文关键字:输出 C++ 返回 Char      更新时间:2023-10-16

我正在尝试使用原始字符表和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:"";
}