Invalid allocation size: 4294967295 bytes

幸福的二进制 2017-07-26 11:36:25
当运行时,输入学生姓名时,比如zhang san ,中间有个空格键就会弹出错误显示,Invalid allocation size: 4294967295 bytes
如果是zhangsan 则可以正常运行。

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class Student
{
public:
~Student();
void InputStudent(void);
void OutputStudent(void);
void DeleteStudent(void);
void SearchStudent(void);
void ChangeStudent(void);
void ScortByChinese(void);
void ScortByMath(void);
void ScortByEnglish(void);
void ScortByTotal(void);

private:
Student *St;
int Size;
string Name;
int Age;
int No;
float Score[3];
float Total;
float Ave;
};

Student::~Student()
{
delete(St);
}

void Student::InputStudent(void)
{
int len;
cout << "请输入学生的人数:" ;
cin >> len;
system("cls");
Size = len;
St = new Student[Size];
for(int i = 0;i<len;i++)
{
cout << "请输入第"<<i+1 <<"个学生的姓名:" ;
cin >> St[i].Name;
cout << "请输入第" << i+1 << "个学生的年龄:";
cin >> St[i].Age;
cout << "请输入第" << i+1 << "个学生的学号";
cin >> St[i].No;
cout << "请输入第" << i+1 << "个学生的语文成绩:";
cin >> St[i].Score[0];
cout << "请输入第"<< i+1 << "个学生的数学成绩:";
cin >> St[i].Score[1];
cout << "请输入第"<<i+1 << "个学生的英语成绩:";
cin >> St[i].Score[2];

St[i].Total = St[i].Score[0]+St[i].Score[1] + St[i].Score[2];
St[i].Ave = St[i].Total/3.0f;
system("cls") ;
}
}

下面的代码也不知道需不需要发。
当运行时,输入学生姓名时,比如zhang san ,中间有个空格键就会弹出错误显示,Invalid allocation size: 4294967295 bytes
如果是zhangsan 则可以正常运行。
...全文
441 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rayw0ng 2017-07-26
  • 打赏
  • 举报
回复
  char buf[20];
  cin.getline(buf,19);
  name = buf;
cout 默认读到空格就停止了,所以后面到字符会存到 age ,但 age 是整型,类型不匹配。 使用 getline 可以读到换行,保留中间的空格。
幸福的二进制 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 loneking2001 的回复:
  char buf[20];
  cin.getline(buf,19);
  name = buf;
cout 默认读到空格就停止了,所以后面到字符会存到 age ,但 age 是整型,类型不匹配。 使用 getline 可以读到换行,保留中间的空格。
谢谢您,,让我知道了原因。万分感谢!!!!!!
幸福的二进制 2017-07-26
  • 打赏
  • 举报
回复
引用 2 楼 fight_in_dl 的回复:
引用
有个空格键就会弹出错误
一楼指出了原因,但好象没给出正确的解决方案(时间关系,没验证,说错请原谅) getline函数遇到'n'就终止,缓冲区会遗留下回车符'n',进而影响下一次输入的正确性。 给出代码如下:
for (int i = 0; i < len; i++)
	{
		cout << "请输入第" << i + 1 << "个学生的姓名:";
		getline(cin, (St[i].Name));  
		cin.ignore(1000, '\n');  //注意应加入此行,以清除之前缓冲区留下的回车符。
		
		cout << "请输入第" << i + 1 << "个学生的年龄:";
                ...........
谢谢!!!!万分感谢!我试了一下,能够有空格输入了,,,,想了好久!谢谢你
幸福的二进制 2017-07-26
  • 打赏
  • 举报
回复
不好意思,我这样改好像不对,运行到输入姓名的时候直接就到输入age了,不好意思,您能告诉我该怎么改吗?



战在春秋 2017-07-26
  • 打赏
  • 举报
回复
引用
有个空格键就会弹出错误
一楼指出了原因,但好象没给出正确的解决方案(时间关系,没验证,说错请原谅) getline函数遇到'n'就终止,缓冲区会遗留下回车符'n',进而影响下一次输入的正确性。 给出代码如下:
for (int i = 0; i < len; i++)
	{
		cout << "请输入第" << i + 1 << "个学生的姓名:";
		getline(cin, (St[i].Name));  
		cin.ignore(1000, '\n');  //注意应加入此行,以清除之前缓冲区留下的回车符。
		
		cout << "请输入第" << i + 1 << "个学生的年龄:";
                ...........

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧