由于某种原因,代码崩溃并给我一个访问冲突错误。它一直说对象用户未初始化。
随机编码中0x0F45E89A(msvcr110d.dll)的第一次机会异常 在C ++。exe:0xC0000005:访问冲突写入位置 在Random的0x0F45E89A(msvcr110d.dll)处的0xABABABAB.Unhandled异常 在C ++中编码.exe:0xC0000005:访问冲突写入位置 0xABABABAB。
感谢。有什么想法吗?
#include <iostream>
#include <fstream>
#include <cstring>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
struct User {
string name; //Both first and last name go here
int birthYear;
string major;
};
int main()
{
ifstream input("input.txt");
if(!input || !input.is_open())
return -1;
string buffer;
int count = -1;
int index = 0;
int size;
User* users;
while(getline(input, buffer, '\n'))
{
stringstream ss(buffer);
if(count == -1)
{
ss >> size;
users = new User[size];
count = 0;
}
else
{
if(count == 0)
{
users[index].name = buffer;
count++;
}
if(count == 1)
{
ss >> users[index].birthYear;
count++;
}
if(count == 2)
{
users[index].major = buffer;
count = 0;
index++;
}
}
}
for(int i = 0; i < 2; i++)
{
cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
}
system ("PAUSE");
return 0;
}
答案 0 :(得分:1)
for(int i = 0; i < 2; i++)
{
cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
}
看起来没有结果。你如何确定用户包含至少两个元素。如果getline
因badfile而失败,或者第一行只建议1条记录,则会超出异常。
您应该将循环更改为
// Initialize size with 0 before while(getline) loop
for(int i = 0; i < size; i++)
{
cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
}
下面的代码行看起来有问题
if(count == 0)
{
users[index].name = buffer;
count++;
}
if(count == 1)
{
ss >> users[index].birthYear;
count++;
}
if(count == 2)
{
users[index].major = buffer;
count = 0;
index++;
}
当count为0时,它将进入第一个if条件并且增加。然后条件count == 1
将变为真,您也将访问接下来的2个条件。您应该使用if
替换下2个else if
条件或使用switch
语句替换break
以查看intended behavior。
完成后,释放用户也是一种好习惯。
答案 1 :(得分:0)
我认为第一个getline
失败(while没有输入,因此没有创建任何内容)并且您自动到达for循环。检查您确实拥有用户。