我刚开始学习c ++,在整个指针/数组的章节中,我正在尝试编写一些东西以掌握这些概念。我希望我的代码要做的是:1)要求一些学生,2)为每个学生要一个名字,3)在一个结构中为这个学生分配一个ID和名字,4)打印学生ID和姓名用于验证。
问题如下。 比方说,例如,我选择输入3名学生并键入以下名称:
JOHN
GEORGE
NICK
程序打印回来的学生证/姓名将是:
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;
}
答案 0 :(得分:0)
cin.ignore();
会从cin
丢弃,这是一个大小为1的流。
<强> istream的&安培; ignore(streamsize n = 1,int delim = EOF);
提取和 discard characters从输入序列中提取字符 抛弃它们。
删除它。这似乎是你的代码中唯一可以吃掉一个角色的东西。此外,如果您需要使用ignore,请使用以下内容:
cin.ignore(256,' ');
^ ^ (number of char, delim)
如果您试图忽略您为nLoops
输入的字符,则无需在每次迭代中执行此操作。
答案 1 :(得分: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()
。