C ++中的cin.get()函数

时间:2018-03-30 20:34:12

标签: c++ c++11

我一直在研究c ++,并且遇到了以下代码。我不明白为什么他们必须在" cin.get(straddress,sizeof(straddress),fdelim).get(c)"中使用get(c)。没有这个get(c),代码工作得很好。有人可以启发我使用get(c)吗?该程序的目的是读取混合类型的数据。

const char fdelim = '\t';
char straddress[256];
int zip;
char c;

cout << "Enter a record of data:  ";
cin.get(straddress, sizeof(straddress), fdelim).get(c) >> zip;
cout << "\nStreet address :   " << straddress << endl;
cout << "\nZip/Postal code:   " << zip << endl;

2 个答案:

答案 0 :(得分:3)

该行

cin.get(straddress, sizeof(straddress), fdelim).get(c) >> zip;

读取fdelimstraddress的所有内容,然后将分隔符读取到c,然后将邮政编码读取到zip

它可以写得更好:

cin.get(straddress, sizeof(straddress), fdelim);
cin.get(c);
cin >> zip;

由于未使用c,因此也可以忽略它。

cin.get(straddress, sizeof(straddress), fdelim);
cin.ignore(1); // Read and discard 1 character.
cin >> zip;

答案 1 :(得分:0)

假设用户在键入\t字符之前键入少于255个字符,则在\t字符到达时,对cin.get()的第一次调用将停止读取,但不会提取来自cin。然后,对cin.get()的下一次调用将提取\t

我会选择使用std::istream::getline(),它会读取分隔符,但不会将其存储在调用者的缓冲区中:

const char fdelim = '\t';
char straddress[256];
int zip;

cout << "Enter a record of data:  ";
cin.getline(straddress, sizeof(straddress), fdelim);
cin >> zip;
cout << "\nStreet address :   " << straddress << endl;
cout << "\nZip/Postal code:   " << zip << endl;

更好的是,我会使用std::getline()代替std::string而不是char[]缓冲区:

const char fdelim = '\t';
string straddress;
int zip;

cout << "Enter a record of data:  ";
getline(cin, straddress, fdelim);
cin >> zip;
cout << "\nStreet address :   " << straddress << endl;
cout << "\nZip/Postal code:   " << zip << endl;