0

私は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;
}

しかし、スペースバーで名前を入力しようとすると (たとえば、1 人の学生の姓と名)、サークルが 1 ステップ抜けたようなエラーが発生しました ここに画像の説明を入力

string名前に使ってみた

string name

しかし、問題は同じままです。

何が問題で、どうすれば修正できますか?

4

3 に答える 3

4

コードにはいくつかの問題がありますが、質問しているのは、入力演算子が>>空白で区切られたトークンを読み取るためです。したがって、空白 (スペース、タブ、改行など) を含む文がある場合、最初の「単語」のみが取得されます。

std::getline代わりに使用してください。

于 2013-10-10T11:05:02.307 に答える
2

このエラーの原因を説明しようと思います。

内部に基本的にs のcin配列であるバッファーがあると想像してください。char

 END
  |
+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+

現時点では、バッファーは空です (END を最初のセルに「ポイント」することで表示しようとしたため)。cin >> name最初に行うことcinは、現在バッファーに何かがあるかどうかを確認することです。存在しない場合は、プロンプトが表示され、入力がバッファーにコピーされます。

                                 END
                                  |
+---+---+---+---+---+---+---+---+---+
| H | e | l | l | o |   | ! |\n |   |
+---+---+---+---+---+---+---+---+---+

これで、バッファ内にあるもの (「空白」文字まで) がコピーされ、バッファnameの内容が下に移動されます。これname == "Hello"で、バッファは次のようになります。

             END
              |
+---+---+---+---+---+---+---+---+---+
|   | ! |\n |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+

バッファーが空ではないことに注意してください。次にcin >> name同じチェックを行うと、バッファーに既に何かがあることがわかります。そのため、プロンプトは表示されません。これが、何も求めずにテキストが印刷される理由です。値cin >> nameを割り当てます(前のスペースをスキップします)が、バッファはまだ空ではありません。まだ文字があります( を押したときから)。この新しい行を飲み込みますが、結果には含めません。name"!"\nEntergetline

于 2013-10-10T11:54:53.377 に答える
0

cin >>空白を削除します。cin.getline()代わりに使用してみてください。

于 2013-10-10T11:09:07.160 に答える