cout输出乱码行而不是实际用户的cout声明

时间:2017-09-20 14:36:43

标签: c++ cout

这是我的头文件

#ifndef KINGDOM_H_
#define KINGDOM_H_

#include <string>
using namespace std;
namespace sict{
    class Kingdom {
    public:
        char m_name[32];
        int m_population;

    };
    void display(Kingdom& pKingdom);
}
#endif

这些是我的cpp文件

#include <iostream>
#include <string>
#include "kingdom.h"

using namespace std;

namespace sict {

    void display(Kingdom& pKingdom) {
        cout << pKingdom.m_name << ", population " << pKingdom.m_population << endl;
    }
}

这是我最后一个cpp文件

#include <iostream>
#include "Kingdom.h"

using namespace std;
using namespace sict;

void read(sict::Kingdom&);

int main() {
    int count = 0; // the number of kingdoms in the array
    Kingdom* pKingdom = nullptr;


    cout << "==========\n"
        << "Input data\n"
        << "==========\n"
        << "Enter the number of Kingdoms: ";
    cin >> count;
    cin.ignore();

    if (count < 1) return 1;


    pKingdom = new Kingdom[count];
    for (int i = 0; i < count; ++i) {
        cout << "Kingdom #" << i + 1 << ": " << endl;
        cin >> i;
        cout << "Enter the name of the Kingdom: " << pKingdom[i].m_name;
        cin >> pKingdom[i].m_name;
        cout << "Enter the number people living in " << pKingdom[i].m_population << ": ";
        cin >> pKingdom[i].m_population;

    }
    cout << "==========" << endl << endl;

    // testing that "display(...)" works
    cout << "------------------------------" << endl
        << "The 1st kingdom entered is" << endl
        << "------------------------------" << endl;
    sict::display(pKingdom[0]);
    cout << "------------------------------" << endl << endl;


    delete[]pKingdom;
    pKingdom = nullptr;
            return 0;
}

// read accepts data for a Kingdom from standard input

void read(sict::Kingdom& kingdom) {

    cout << "Enter the name of the Kingdom: ";
    cin.get(kingdom.m_name, 32, '\n');
    cin.ignore(2000, '\n');
    cout << "Enter the number of people living in " << kingdom.m_name << ": ";
    cin >> kingdom.m_population;
    cin.ignore(2000, '\n');
}

当代码到达部分输入王国名称时,它会提示用户回答,但在提示之前,它只是输出这样的乱码

https://i.imgur.com/MSSHgvz.png

此外,当它输入居住的人数时,在输入有效数字之前,它也会输出“-842150451”。

任何可以解决问题的猜测?

2 个答案:

答案 0 :(得分:2)

您的程序打印垃圾,因为变量(char[]int)未初始化。实际行为未定义。要解决这个问题,你应该在你的类中添加一个构造函数并初始化变量。

进一步阅读:

此外,当您使用std::cin让用户将王国名称输入固定大小的char数组时,它们很容易产生缓冲区溢出。这通常是不可取的。请改用std::string

不鼓励使用using namespace std;。特别是在头文件中。

进一步阅读:

除非你有充分的理由,否则通常不应该使用指针动态分配对象或数组。如果需要在运行时分配数组,请改用std::vector

进一步阅读:

您应该为&lt;&lt;添加重载和&gt;&gt;适合您班级的操作员。那时你不需要公开那些成员。

进一步阅读:

答案 1 :(得分:0)

你可以这样做。我很快就做到了,所以它并不完美。

的main.cpp

#include "Kingdom.h"

int main() {
    int count = 0; // the number of kingdoms in the array
    sict::Kingdom* pKingdom = nullptr;


    std::cout << "==========\n"
        << "Input data\n"
        << "==========\n"
        << "Enter the number of Kingdoms: ";
    std::cin >> count;
    std::cin.ignore();

    if (count < 1) return 1;

    //without read()
    //pKingdom = new sict::Kingdom[count];
    //for (int i = 0; i < count; ++i) {
    //    std::cout << "Kingdom #" << i + 1 << ": \n";
    //    //cin >> i;
    //    std::cout << "Enter the name of the Kingdom: ";
    //    pKingdom[i].setName();
    //    std::cout << "Enter the number people living in " << pKingdom[i].m_name << ": ";
    //    std::cin >> pKingdom[i].m_population;

    //}
    //std::cout << "==========\n\n";

    pKingdom = new sict::Kingdom[count]();

    for (int i = 1; i <= count; ++i)
    {
        pKingdom[i-1].read();
    }


    // testing that "display(...)" works
    std::cout << "------------------------------\n"
        << "The 1st kingdom entered is:\n"
        << "------------------------------\n";
    pKingdom[0].display();
    std::cout << "------------------------------\n\n";


    delete[]pKingdom;
    pKingdom = nullptr;
    return 0;
}

Kingdom.h

#ifndef KINGDOM_H_
#define KINGDOM_H_

#include <iostream>
#include <string>

namespace sict {

    class Kingdom {
    private:
        std::string m_name;
        int m_population;
    public:
        Kingdom();

        void display();
        void read();

        const std::string& getName();
        void setName(std::string name);
        const int& getPopulation();
        void setPopulation(int population);
    };
}
#endif

Kingdom.cpp

#include "Kingdom.h"

namespace sict {

    Kingdom::Kingdom()
        :m_name(""),
        m_population(0)
    {}

    void Kingdom::display() {
        std::cout << "Name: " << m_name << ", population: " << m_population << "\n";
    }

    void Kingdom::read() {
        std::cout << "\n\nEnter the name of the Kingdom: ";
        std::getline(std::cin, m_name);

        std::cout << "Enter the number of people living in " << m_name << ": ";
        std::cin >> m_population;
        std::cin.ignore();
    }

    const std::string& Kingdom::getName()
    {
        return m_name;
    }

    void Kingdom::setName(std::string name)
    {
        m_name = name;
    }

    const int& Kingdom::getPopulation()
    {
        return m_population;
    }

    void Kingdom::setPopulation(int population)
    {
        m_population = population;
    }

}