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

cin.ignore();没有参数从 中丢弃cin大小为 1 的流。

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

提取和丢弃字符 从输入序列中提取字符并丢弃它们。

删除它。这似乎是您的代码中唯一可以吃掉一个字符的东西。此外,如果您需要使用忽略,请使用以下内容:

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

如果您试图忽略作为 输入的字符nLoops,则无需在每次迭代中都这样做。

于 2012-11-12T18:20:37.263 回答
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 回答