0

我正在学习 c++,我需要在 c++ 中创建结构“学生”并使用它(我使用 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

但问题仍然存在。

出了什么问题以及如何解决?

4

3 回答 3

4

您的代码有几个问题,但关于您要询问的问题是因为输入运算符>>读取空格分隔的标记。因此,如果您有一个带有空格的句子(例如空格、制表符、换行符),您只会得到第一个“单词”。

改为使用std::getline

于 2013-10-10T11:05:02.307 回答
2

我将尝试解释导致此错误的原因。

想象一下有一个缓冲区,里面cin基本上是一个chars 数组:

 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吞下这条新行,但不将其包含在结果中。

于 2013-10-10T11:54:53.377 回答
0

cin >>将删除空格。尝试cin.getline()改用。

于 2013-10-10T11:09:07.160 回答