从头文件中获取数组会导致程序崩溃

时间:2015-06-06 10:23:32

标签: c++ arrays

我最近完成了一个关于C ++的课程,测试看我从中得到了什么我决定开始进行操作系统仿真,看起来情况相当好,直到我试图通过使用实现多用户系统一个用于存储用户名的数组,用户将从中选择一个用户名,然后它将进入用户。但问题是,当我尝试修改源文件中的头文件中的数组时,程序崩溃了。 头文件:

#ifndef UBUNTU_LOGIN_H
#define UBUNTU_LOGIN_H
#include "Ubuntu_UserDetails.h"
#include <iostream>
#include <string>
#include <vector>

class Ubuntu_Login: protected UserDetails
{
public:
  void Ubuntu_UserCreation();
  void Ubuntu_login();
};

#endif // UBUNTU_LOGIN_H
#ifndef UBUNTU_USERDETAILS_H
#define UBUNTU_USERDETAILS_H
#include "Ubuntu_login.h"
#include <string>
#include <vector>
class UserDetails
{
protected:
  std::string username;
  std::string password;
  std::string users[0];
};

#endif // UBUNTU_USERDETAILS_H

源文件:

#include "Ubuntu_login.h"
#include "Ubuntu_UserDetails.h"
#include <iostream>
#include <vector>
#include <string>

void Ubuntu_Login::Ubuntu_UserCreation()
{
  std::cout << "\t _____________" << std::endl;
  std::cout << "\t|Create a user|\n" << std::endl;

  std::cout << "Enter a username:" << std::endl;
  std::getline(std::cin, username);

  std::cout << "Enter a password:" << std::endl;
  std::getline(std::cin, password);

  users[0] = username;
  std::cout << users[0] << std::endl;

  std::cout << "User created successfully" << std::endl;
}


void Ubuntu_Login::Ubuntu_login()
{
  std::cout << "\t ______" << std::endl;
  std::cout << "\t|Log in|\n" << std::endl;
  std::cout << "Select user" << std::endl;
}
 
#include "Ubuntu_login.h"
#include <iostream>


int main()
{
 Ubuntu_Login UO;
 UO.Ubuntu_UserCreation();
 UO.Ubuntu_login();

}

当我尝试运行它时,我得到初始密码输入然后程序崩溃,我认为这是由于堆栈溢出,但我不知道如何解决它。任何有关解决此问题的帮助都将非常感谢,以及整个代码的一般帮助:)。

也是我没有把密码存储为哈希或不回复密码之类的原因仅仅是因为我不知道这样做的语法而我想尝试做我知道怎么做的事情首先,然后再添加其他功能,所以不要期待很棒的代码:P

2 个答案:

答案 0 :(得分:1)

使用std::vector<std::string> users

然后只是users.push_back(username)。动态数组适用于此。

答案 1 :(得分:0)

在您的Ubuntu_UserDetails.h中,UserDetails班级中有此数据成员:

std::string users[0];

然后在源文件中,您有以下任务:

users[0] = username;

如果访问索引为0的数组中的项,则该数组必须至少包含一个元素。实际上,索引0指的是数组中的第一个项。

因此,应该将users数组定义为具有更大的大小。

但是,更好的是,考虑为矢量使用方便的C ++容器类,例如 std::vector

因此,在头文件中,您可以像这样定义数据成员:

// Instead of:
//   std::string users[0]
//
std::vector<std::string> userNames; // probably better than "users"

然后,您可以使用push_backemplace_back方法向矢量添加新项目。