2017-09-20 250 views
0

的jibberish线这是我的头文件COUT输出消息,而不是实际用户的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'); 
} 

当代码到达部件输入Kingdom名称时,它会提示用户回答,但在提示之前,它只是输出jibberish这样

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

而且,当它到达进入人们生活的数量,这也将输出“-842150451”之前,我甚至可以输入一个有效的数字。

任何猜测来解决问题?

+0

因子的所有指针。然后使用'std :: string'而不是char缓冲区。不要在标题中使用名称空间标准。最后,不要在变量初始化之前打印出变量。 – moooeeeep

+0

你是指所有指针的意思是什么? – lucas

+0

请勿在您的代码中使用它们。 – moooeeeep

回答

2

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

对于进一步阅读:

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

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

对于进一步阅读:

除非你有你一般不应使用指针来动态分配对象或数组可以很好的理由。如果您需要在运行时分配数组,请改为使用std::vector

对于进一步阅读:

你也许应该补充重载的< <和>>操作符类。您当时不需要公开声明这些成员。

对于进一步阅读:

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; 
    } 

}