1

私は c++ を学び始めたばかりで、このポインター/配列の章全体で、これらの概念を把握するために何かをコーディングしようとしています。コードで実行したいことは次のとおりです。1) 多数の学生を要求する、2) 各学生の名前を要求する、3) 構造体でこの学生に ID と名前を割り当てる、4) 学生 ID と名前を出力する検証用。

問題は次のとおりです。たとえば、3 人の生徒を入力し、次の名前を入力するとします。

JOHN
GEORGE
NICK

プログラムが学生 ID/名前として出力するものは次のようになります。

0 JOHN
1 EORGE
2 ICK

すべての名前の最初の文字をカットするようですが、最初の文字は削除されます。

#include <iostream>
using namespace std;

struct STUDENT
{
char chName[256];
int nID;
};

int main(){

//array tests

int i=0;
int nLoops=0;                   //number entered by user
STUDENT *pnStudents;            //pointer to our student array

cout << "Enter number of students: ";
cin >> nLoops;

pnStudents = new STUDENT[nLoops];

for (i=0 ; i < nLoops ; i++)
{
    cout << endl << "Full Name of Student " << i <<": ";
    cin.ignore();
    cin.getline(pnStudents[i].chName,255);

    pnStudents[i].nID=i;
}

for (i=0 ; i < nLoops ; i++)
{
    cout << pnStudents[i].nID << " " << *pnStudents[i].chName << endl;
}

system("pause");

return 0;
}
4

2 に答える 2

0
for (i=0 ; i < nLoops ; i++)
{
    cout << endl << "Full Name of Student " << i <<": ";
    cin.ignore();
    cin.getline(pnStudents[i].chName,255);

    pnStudents[i].nID=i;
}

ループの最初の繰り返しで、呼び出しignore()によってストリームに残された改行文字を抽出しcin >> nLoops;ます。istream::getline()一方、末尾'\n'を破棄するため、後続の各反復は入力の最初の文字を待機して破棄します。

cin.ignore()ループの直前に移動します。

于 2012-11-12T18:26:00.810 に答える
0

cin.ignore();cin引数なしでは、サイズ 1 のストリームであるを破棄します。

istream& ignore ( streamsize n = 1, int delim = EOF );

文字の抽出と破棄 入力シーケンスから文字を抽出して破棄します。

それを削除します。それがあなたのコードで唯一のことのようで、1文字を食い尽くす可能性があります。また、ignore を使用する必要がある場合は、次のようなものを使用します。

cin.ignore(256,' ');
            ^   ^   (number of char, delim)

の入力として使用した文字を無視しようとしているnLoops場合、すべての反復でそれを行う必要はありません。

于 2012-11-12T18:20:37.263 に答える