我正在学习c ++,我需要在c ++中创建结构“Student”并使用它(我使用Microsoft Visual C ++ 2010 Express)
我创建了 Student.cpp 文件
#include "stdafx.h"
using namespace std;
const int num = 5;
struct Student {
char name[30];
int groupNumber;
int progress[num];
};
这是我的程序
#include "stdafx.h"
#include "Student.cpp"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "Russian");
srand((unsigned)time(NULL));
int n;
cout << "Введите количество студентов в группе n = ";
cin >> n;
Student * Group = new Student[n];
for (int i = 0; i < n; ++i)
{
cout << "Введите ФИО: ";
cin >> Group[i].name;
Group[i].groupNumber = rand()%5 + 1;
for (int j = 0; j < num; ++j)
{
Group[i].progress[j] = rand()%5 + 2;
}
}
for (int i = 0; i < n; ++i)
{
int sum = 0;
for (int j = 0; j < num; ++j)
{
sum += Group[i].progress[j];
}
double count = (double)sum/5;
if (count < 4) continue;
cout << "\n\n" << Group[i].name << "\nГруппа: " << Group[i].groupNumber << "\nСредний бал: " << count;
}
cout << "\n\n";
delete [] Group;
system("PAUSE");
return 0;
}
但是当我尝试用空格键输入名称时(例如,一个学生的名字和姓氏),我得到的错误就像我的圈子错过了一步
我尝试将string
用于名称
string name
但问题保持不变。
有什么问题以及如何解决?
答案 0 :(得分:4)
您的代码存在一些问题,但是关于它的问题是因为输入运算符>>
读取空格分隔的标记。因此,如果您有一个带空格的句子(例如空格,制表符,换行符),您将只获得第一个“单词”。
改为使用std::getline
。
答案 1 :(得分:2)
我将尝试解释导致此错误的原因。
想象一下cin
内部有一个缓冲区,它基本上是char
的数组:
END
|
+---+---+---+---+---+---+---+---+---+
| | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
此时缓冲区为空(因为我试图通过在第一个单元格处具有END“点”来显示)。当你说cin >> name
时,cin
做的第一件事就是检查缓冲区中是否有任何内容。如果没有,则会提示您并将输入复制到缓冲区中:
END
|
+---+---+---+---+---+---+---+---+---+
| H | e | l | l | o | | ! |\n | |
+---+---+---+---+---+---+---+---+---+
现在它将缓冲区中的内容(最多为“空格”字符)复制到name
中,然后向下移动缓冲区的内容。所以现在name == "Hello"
和缓冲区看起来像这样:
END
|
+---+---+---+---+---+---+---+---+---+
| | ! |\n | | | | | | |
+---+---+---+---+---+---+---+---+---+
注意缓冲区不是空的。下次执行cin >> name
时,它会执行相同的检查并发现缓冲区中已存在某些内容,因此不会提示。这就是为什么你的文字打印出来而不要求你做任何事情。 cin >> name
将为name
分配值"!"
(它将跳过前面的空格),但缓冲区仍然不为空;它仍然具有\n
字符(从您按 Enter 时开始)。 getline
吞下这个新行但不包含在结果中。
答案 2 :(得分:0)
cin >>
将删除空格。尝试使用cin.getline()
代替。