Struture“学生”C ++

时间:2013-10-10 10:59:20

标签: c++

我正在学习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;
}

但是当我尝试用空格键输入名称时(例如,一个学生的名字和姓氏),我得到的错误就像我的圈子错过了一步 enter image description here

我尝试将string用于名称

string name

但问题保持不变。

有什么问题以及如何解决?

3 个答案:

答案 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()代替。