尝试使用cin>>设置字符串问题的值时程序崩溃

时间:2013-10-24 18:42:38

标签: c++ string cin

这是一个我从未见过的奇怪错误,并且不知道如何修复它。崩溃发生在

na = m

这是相关代码。有问题的行标有*:

在Main:

#include <cstdlib>
#include <iostream>
#include "stu.h"
#include <string>
#include <iomanip>

using namespace std;

int main(int argc, char *argv[])
{   
    stu stu;
    int score[2];

    std::string name;
    std::cout <<"enter name:";
    std::cin >> name;
     //THIS IS AN EDIT IN  AFTER SEEING THAT A IMPORTANT ERROR POINT WAS NOT SHOWN TO THE FIRST COUPLE REPLY 
       ************************************************************
     //THIS IS CAUSING THE PROBLEM WHEN I COMMENT IT OUT THE PROGRAM WORKS 
     std::cout << "enter score 1:";
     std::cin >> score[0];
     std::cout << "enter score 2:";
     std::cin >> score[2];
     std::cout << "enter score 3:";
     std::cin >> score[3];
      *************************************************************
    stu.setname( name );

    // ...
}

stu.ccp

void stu::setname(std::string m)
{
    std::cout <<"1";//<--to find where the code was crashing 

    na = m; // *** the crash

    std::cout <<"1";
}

stu.hpp

class stu
#include <string>
{
public:
    stu();
    void setname(std::string);
    std::string getname();
    void settest(int, int,int);
    void display();

private:
    std::string na;

    int score[2];   
};

4 个答案:

答案 0 :(得分:1)

定义int score[2]时,您得到一个2 int的数组,有效数组索引为0..1

您的后续代码会写入数组的末尾,并在内存中跟踪它后面的内容,在本例中为字符串对象name

std::cout << "enter score 1:";
std::cin >> score[0];
std::cout << "enter score 2:";
std::cin >> score[2];
std::cout << "enter score 3:";
std::cin >> score[3];

最后两个数组引用不正确。

答案 1 :(得分:1)

您为数组中的两个整数分配了足够的空间,具有有效索引01

 int score[2];

然后你试图阅读比那更多的元素

 std::cin >> score[2];
 std::cout << "enter score 3:";
 std::cin >> score[3];

这是未定义的行为,允许发生任何,包括整个计算机在火球中消失。在你的情况下,它覆盖了数组旁边的内存,这是你的string变量。复制损坏的字符串很容易导致程序崩溃。

答案 2 :(得分:0)

我已经尝试过你的代码,它编译并运行没有问题。

除了您提供的内容之外,我刚刚定义了构造函数,在#include <string> class stu之前移动了stu.h并删除了std::cout << "1"

答案 3 :(得分:0)

int score [2]

只有得分[0]和得分值[1]。使用 尝试

   int score[3]

然后将您的值存储在

 score[0];
 score[1];
 score[2];