Strcpy_s0710 2021-06-10 18:41 采纳率: 0%
浏览 1781

引发了异常: 写入访问权限冲突。 **_Str** 是 0x1110112。

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iomanip>
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
class City
{
	int number;
	char name[200];
	int x; int y;
public:
	City(int num = 0, char *n= NULL , int a = 0, int b = 0)
	{
		if (n)			
			strcpy(name, n);		
		else strcpy(name, " ");
		number = num;
		x = a;
	    y = b;
	}
	void show()
	{
		cout << number << '\t';
		cout << name;
		cout << '\t';
		cout << x << '\t' << y << endl;
	}
	void setNumber(int num) { number = num; }
	void setName(char* na)
	{
		strcpy(name, na);
	}
	void setPosition(int xpos, int ypos)
	{
		x = xpos;
		y = ypos;
	}
	void getName(char* n) { strcpy(n, name); }
	int getNum() { return number; }
	int getX() { return x; }
	int getY() { return y; }
};
class Map
{
	City* cities;
	int curCounter=0;
	int maxCounter=0;
public:
	Map(int maxc = 10)
	{
		curCounter = 0;
		maxCounter = maxc;
		if (maxc)
			cities = new City[maxCounter];
		else
			cities = NULL;
	}
	Map(Map& m)
	{
		char* n = NULL;
		if (m.maxCounter)
		{
			cities = new City[m.maxCounter];
			for (int i = 0; i < m.curCounter; i++)
			{
				(*(cities + i)).setPosition((*(m.cities + i)).getX(), (*(m.cities + i)).getY());
				((*(cities + i)).setNumber((m.cities + i)->getNum()));
				(m.cities + i)->getName(n);
				(*(cities + i)).setName(n);

			}
		}
		else
			cities = NULL;
	}
	~Map()
	{
		delete[] cities;
	}
	double Distance(int x1, int y1, int x2, int y2)
	{
		return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
	}
	void AddCity(int num, char* na, int x, int y)
	{
		if (curCounter == maxCounter)
		{
			City* Newcities;
			char* n = NULL;
			Newcities = new City[maxCounter + 10];
			for (int i = 0; i < curCounter; i++)
			{
				Newcities[i].setPosition(cities[i].getX(), cities[i].getY());
				cities[i].getName(n);
				Newcities[i].setName(n);
				Newcities[i].setNumber(cities[i].getNum());
			}
			delete[] cities;
			maxCounter += 10;
			cities = Newcities;
		}
		cities[curCounter].setName(na);
		cities[curCounter].setNumber(num);
		cities[curCounter].setPosition(x, y);
		curCounter++;
	}
	void Deletecity(int num)
	{
		for (int i = 0; i < maxCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				cities[i] = NULL;
				break;
			}
		}
	}
	void SaveCity(char* fn)
	{
		ofstream out;
		out.open(fn);
		out << curCounter << endl;
		for (int i = 0; i < curCounter; i++)
		{
			cities[i].getName(fn);
			out << left << setw(10) << cities[i].getNum()<< left << setw(10) << fn << left << setw(10) << cities[i].getX() << left << setw(10) << cities[i].getY() << endl;
		}
		out.close();
	}
	void ReadCity(char* fn)
	{
		int num,x,y,cur;
		char name[100] = { '\0' };
		fstream in;
		in.open(fn, ios::in);
		if (!in)
		{
			cout << "can not open file" << endl;
			exit(1);
		}
		in >> cur;
		for (int i = 0; i < cur; i++)
		{
			in >> num >> name >> x >> y;
			AddCity(num, name, x, y);
		}
		in.close();
	}
	void UpdateCity(int num)
	{
		int i = 0; int x, y; char* name=NULL;
		for (i = 0; i < curCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				cout << "输入城市名字和坐标:" << endl;
				cin >> name >> x >> y;
				cities[i].setName(name);
				cities[i].setPosition(x, y);
			}
		}
		if (i = curCounter)
			cout << "无信息!" << endl;
	}
	int FindCity(int num)
	{
		int i = 0;  
		for (i = 0; i < curCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				return num;
             }
		}
		return i;
	}
	void ShowCities()
	{
		int i = 0;
		for (i = 0; i < curCounter; i++)
		{
				cities[i].show();
		}
	}
	int GetCurcounter()
	{
		return curCounter;
	}
	int GetPostionX(int num)
	{
		int i = 0; 
		for (i = 0; i < curCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				return cities[i].getX();
			}
		}
	}
	int GetPostionY(int num)
	{
		int i = 0;
		for (i = 0; i < curCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				return cities[i].getY();
			}
		}
	}
	void ShowCity(int num)
	{
		int i = 0; char* name = NULL;
		for (i = 0; i < curCounter; i++)
		{
			if (cities[i].getNum() == num)
			{
				cout << num << '\t';
				cities[i].getName(name);
				cout <<name<< '\t';
				cout << cities[i].getX() << '\t' << cities[i].getY() << endl;
			}
		}
	}
	int MapGetPostionX(int i)
	{
				return cities[i].getX();
	}
	int MapGetPostionY(int i)
	{
		return cities[i].getY();
	}
	void MapShowCity(int j)
	{
		int i = 0; int num; char* name=NULL;
		for (i = 0; i < curCounter; i++)
		{
			if (i==j)
			{
				num = cities[j].getNum();
				cout << num << '\t';
				cities[i].getName(name);
				cout <<name<< '\t';
				cout << cities[j].getX() << '\t' << cities[j].getY() << endl;
			}
		}
	}
};
class Flight
{
	int number;
	char name[20];
	int x; int y;
	double weight;
public:
	Flight(int num = 0, const char n[100]=  "flight", int a=0, int b=0, float wei=0)
	{
		number = num;
		strcpy(name, n);
		x = a; y = b;
		weight = wei;
	}
	void show()
	{
		cout << "number:" << number << '\t' << "name:" ;
		cout << name;
		cout << '\t';
		cout << "coordinate:" << x << "," << y << '\t' << "weight:" << weight;
	}
	int CanBreak(double sp, double reDistance)
	{
		if (((weight * sp) / 5) < reDistance)
			return 1;
		return 0;
	}
	void RadarFind(double radarRadius, Map m)
	{
		for (int i = 0; i < m.GetCurcounter(); i++)
		{
			if (m.Distance(x, y, m.MapGetPostionX(i), m.MapGetPostionY(i)) <= radarRadius)
				m.MapShowCity(i);
		}
	}
	void SetFlight(int num, char* na, double w, int xpos, int ypos)
	{
		number = num;
		strcpy(name, na);
		weight = w; x = xpos; y = ypos;
	}
	int getNumber() { return number; }
	int getX() { return x; }
	int getY() { return y; }
	double getWeight(){ return weight; }
	void getName(char* na) { strcpy(na, name); }
};
class FlightList
{
	Flight* flights;
	int curCounter=0;
	int maxCounter=0;
public:
	FlightList(int maxc = 10)
	{
		curCounter = 0;
		maxCounter = maxc;
		if (maxc)
			flights = new Flight[maxCounter];
		else
			flights = NULL;
	}
	FlightList(FlightList& m)
	{
		char* n = NULL;
		if (m.maxCounter)
		{
			flights = new Flight[m.maxCounter];
			for (int i = 0; i < m.curCounter; i++)
			{
				(m.flights + i)->getName(n);
				(*(flights + i)).SetFlight((*(m.flights + i)).getNumber(),n, (*(m.flights + i)).getWeight(), (*(m.flights + i)).getX(), (*(m.flights + i)).getY());
			}
		}
		else
			flights = NULL;
	}
	~FlightList()
	{
		delete[] flights;
	}
	void AddFlight(int num, char* name, double weight, int x, int y)
	{
		if (curCounter == maxCounter)
		{
			Flight* Newflights;
			char* n = NULL;
			Newflights = new Flight[maxCounter + 10];
			for (int i = 0; i < curCounter; i++)
			{
				Newflights[i] = flights[i];
			}
			delete[] flights;
			maxCounter += 10;
			flights = Newflights;
		}
		flights[curCounter].SetFlight(num, name, weight, x, y);
		curCounter++;
	}
	void DeleteFlight(int num)
	{
		for (int i = 0; i < maxCounter; i++)
		{
			if (flights[i].getNumber() == num)
			{
				flights[i] = NULL;
				break;
			}
		}
	}
	void UpdateFlight(int num)
	{
		int i = 0; int  x, y; char* name=NULL; double w;
		for (i = 0; i < curCounter; i++)
		{
			if (flights[i].getNumber() == num)
			{
				cout << "输入飞机名称、坐标和重量" << endl;
				cin >> name >> x >> y>>w;
				flights[i].SetFlight(num, name, w, x, y);
			}
			if (i = curCounter)
				cout << "无信息!" << endl;
		}
	}
	void ShowFlight()
	{
		int i = 0;
		for (i = 0; i < curCounter; i++)
		{
			flights[i].show();
		}
	}
	int GetCurCounter()
	{
		return curCounter;
	}
	int CanBreak(int num, double speed, double reD)
	{
		int i;
		for ( i = 0; i < maxCounter; i++)
		{
			if (flights[i].getNumber() == num)
			{
				return flights[i].CanBreak(speed, reD);
				break;
			}
		}
		if (i == maxCounter)
			return -1;
	}
	void RadarFind(int num,double rd, Map& m)
	{
		int x=0, y=0;
		for (int i = 0; i < maxCounter; i++)
		{
			if (flights[i].getNumber() == num)
			{
				x = flights[i].getX();
				y = flights[i].getY();
				break;
			}
		}
		for (int i = 0; i < m.GetCurcounter(); i++)
		{
			if (m.Distance(x,y,m.MapGetPostionX(i),m.MapGetPostionY(i))<=rd)
			{
				m.MapShowCity(i);
			}
		}
	}
};
int menu_select()
{
	const char* m[13] = { "1.appendCity",
				 "2.delCity",
				 "3.updCity",
				 "4.SaveToFile",
				 "5.ReadFromFlie",
				 "6.ShowAllCities",
				 "7.AddPlane",
				 "8.DeletePlane",
				 "9.ShowPlane",
				 "10.Brake",
				 "11.RadarFind",
				 "0.QUIT" };
	int i, choice;
	do {
		system("cls");
		for (i = 0; m[i]; i++)
			cout << m[i] << endl;
		cout << "请选择0~11中的任一功能:";
		cin >> choice;
	} while (choice < 0 || choice>11);
	return(choice);
}
void appendCity(Map& mapObj)
{
	int num, x, y; char* name=NULL;
	cout << "输入城市信息" << endl;
	cin >> num >> name >> x >> y;
	mapObj.AddCity(num, name, x, y);
}
void delCity(Map& mapObj)
{
	int num;
	cout << "输入要删除的城市编号:" << endl;
	cin >>num;
	mapObj.Deletecity(num);
}
void updCity(Map& mapObj)
{
	int num;
	cout << "输入要更新的城市编号:" << endl;
	cin >> num;
	mapObj.UpdateCity(num);
}
void SaveToFile(Map& mapObj)
{
	char* fn=NULL;
	cout << "输入需要存入的文件名:" << endl;
	cin >> fn;
	mapObj.SaveCity(fn);
}
void ReadFromFile(Map& mapObj)
{
	char* fn=NULL;
	cout << "输入需要读取的文件名:" << endl;
	cin >> fn;
	mapObj.ReadCity(fn);
}
void ShowAllCities(Map& mapObj)
{
	mapObj.ShowCities();
}
void AddFlight(FlightList& FlightObj)
{
	int num, x, y; double weight; char* name=NULL;
	cout << "输入航班信息:" << endl;
	cin >> num >> name >> weight >> x >> y;
	FlightObj.AddFlight(num, name, weight, x, y);
}
void DeleteFlight(FlightList& FlightObj)
{
	int num;
	cout << "输入要删除的飞机编号:" << endl;
	cin >> num;
	FlightObj.DeleteFlight(num);
}
void ShowFlight(FlightList& FlightObj)
{
	FlightObj.ShowFlight();
}
void Break(FlightList& FlightObj)
{
	double sp, reD; int num;
	cout << "输入需要查询的航班编号、速度和剩余跑道长度" << endl;
	cin >> num>>sp >> reD;
	if (FlightObj.CanBreak(num, sp, reD) == 1)
		cout << "可以刹车" << endl;
	else if (FlightObj.CanBreak(num, sp, reD) == 0)
		cout << "不可以刹车" << endl;
	else cout << "无航班信息" << endl;
}
void RadarSearch(FlightList& FlightObj,Map&m)
{
	int num; double rd;
	cout << "输入航班编号和雷达半径" << endl;
	cin >> num>>rd;
	FlightObj.RadarFind(num, rd, m);
}
char Quit(Map& mapObj)
{
	char li;
	cout << "确认退出?(请输入y或者n)";
	cin >> li;
	if (li == 'y')
	{
		char fn[15] = "D:\\map.txt";
		mapObj.SaveCity(fn);
		return 'y';
	}
	else return 'n';
}
int main()
{
	Map mapObj;
	FlightList flObj;
	int sel;
	for (; ; )
	{
		switch (sel = menu_select())
		{
		case 1:  appendCity(mapObj);
			system("pause"); break;
		case 2:  delCity(mapObj);
			system("pause"); break;
		case 3:  updCity(mapObj);
			system("pause"); break;
		case 4:  SaveToFile(mapObj);
			system("pause"); break;
		case 5:  ReadFromFile(mapObj);
			system("pause"); break;
		case 6:  ShowAllCities(mapObj);
			system("pause"); break;
		case 7:  AddFlight(flObj);
			system("pause"); break;
		case 8:  (flObj);
			system("pause"); break;
		case 9:  ShowFlight(flObj);
			system("pause"); break;
		case 10: Break(flObj);
			system("pause"); break;
		case 11: RadarSearch(flObj, mapObj);
			system("pause"); break;
		case 0:
			if (Quit(mapObj) != 'y')
				continue;
		}
		if (sel == 0) break;
	}
	return 0;
}

 

  • 写回答

1条回答 默认 最新

  • 源客V 2023-04-24 17:02
    关注

    你的代码:

    void appendCity(Map& mapObj)
    {
        int num, x, y; char* name = NULL;
        cout << "输入城市信息" << endl;
        cin >> num >> name >> x >> y;
        mapObj.AddCity(num, name, x, y);
    }
    

    这段代码存在以下问题:
    1、没有为 name 分配足够的内存空间,因此在输入字符串前应该为其分配足够的内存空间。
    2、cin >> num 只会读取一个整数并跳过后面的空格,而输入的格式为 "num name x y",所以需要使用 getline() 函数来获取一整行输入,并解析它。
    修改后的代码如下:

    int num, x, y;
    char* name = new char[100]; // 分配 100 个字符的空间
    cout << "输入城市信息" << endl;
    string line;
    getline(cin, line);
    sscanf(line.c_str(), "%d %s %d %d", &num, name, &x, &y);
    
    评论

报告相同问题?

问题事件

  • 请详细说明问题背景 9月27日

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考