在网上查过关于cin.getline()用法之类的文章,也翻阅过不少有关I/O的书籍,我便认为已深刻认识了cin.getline(),但一次意外的使用却使我百思不得其解,请看以下两段代码。
代码1:
void main()
{
char a[10];
cin.getline(a,10);//输入"123456789"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出10
}
代码2:
void main()
{
char a[10];
cin.getline(a,10);//输入"1234567890"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出9
}
为什么两次输入得到的cin.gcount()结果会不同?在多次试验与假设中,我或许得到了正确的解释。
首先,我们要注意一下,其实cin.getline(a,10)还有一个默认参数,只是隐藏了而已,它就是输入的边界符,默认为'/n'。那么,我把它的真面目还原一下,即cin.getline(a,10,'/n')。
然后,我们再看看cin.getline(a,10,'/n')是如何运作的,我看过的一些书上说cin.getline()会把'/n'给丢弃。
事实上,在cin.getline()的第二个参数的范围内,如果输入了'/n','/n'会先从缓冲区中被接收(或读取),然后再被丢弃。而cin.gcount()的作用是输出从输入流中被读取的字符数(或字节数),所以在代码1中cin.gcount()会输出10,即使'/n'已被cin.getline()所丢弃,但'/n'的确被读取了(从缓冲区已找不到'/n'的影子)。如果你要问“你怎么知道啊?”,我会回答:“是cin.gcount()告诉我的!”正如代码1,输入“123456789”,它不会像cin.get(a,10)那样输出9,而是输出10。
那么,代码二的cout << cin.gcount()为什么会输出9呢?这是因为在cin.getline()的第二个参数的范围内,并没遇到'/n',故只接收前9个可视字符,后再自动补加一个'/0'.
证明:
代码3:
void main()
{
char a[10];
cin.getline(a,10,'0');//输入"1234567890"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出10
}
PS:由于istream的成员函数都被封装起来,所以无法确认是否真的如此,加上在MSDN上对cin.getline()也没详细的分析内部原理,故写此文章来大胆猜测一下。以上代码均通过VC6.0,如有知道cin.getline()的内部实现的,恳请指教!
在网上查过关于cin.getline()用法之类的文章,也翻阅过不少有关I/O的书籍,我便认为已深刻认识了cin.getline(),但一次意外的使用却使我百思不得其解,请看以下两段代码。
代码1:
void main()
{
char a[10];
cin.getline(a,10);//输入"123456789"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出10
}
代码2:
void main()
{
char a[10];
cin.getline(a,10);//输入"1234567890"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出9
}
为什么两次输入得到的cin.gcount()结果会不同?在多次试验与假设中,我或许得到了正确的解释。
首先,我们要注意一下,其实cin.getline(a,10)还有一个默认参数,只是隐藏了而已,它就是输入的边界符,默认为'/n'。那么,我把它的真面目还原一下,即cin.getline(a,10,'/n')。
然后,我们再看看cin.getline(a,10,'/n')是如何运作的,我看过的一些书上说cin.getline()会把'/n'给丢弃。
事实上,在cin.getline()的第二个参数的范围内,如果输入了'/n','/n'会先从缓冲区中被接收(或读取),然后再被丢弃。而cin.gcount()的作用是输出从输入流中被读取的字符数(或字节数),所以在代码1中cin.gcount()会输出10,即使'/n'已被cin.getline()所丢弃,但'/n'的确被读取了(从缓冲区已找不到'/n'的影子)。如果你要问“你怎么知道啊?”,我会回答:“是cin.gcount()告诉我的!”正如代码1,输入“123456789”,它不会像cin.get(a,10)那样输出9,而是输出10。
那么,代码二的cout << cin.gcount()为什么会输出9呢?这是因为在cin.getline()的第二个参数的范围内,并没遇到'/n',故只接收前9个可视字符,后再自动补加一个'/0'.
证明:
代码3:
void main()
{
char a[10];
cin.getline(a,10,'0');//输入"1234567890"
cout << a<< endl; //输出"123456789"
cout << cin.gcount();//输出10
}
PS:由于istream的成员函数都被封装起来,所以无法确认是否真的如此,加上在MSDN上对cin.getline()也没详细的分析内部原理,故写此文章来大胆猜测一下。以上代码均通过VC6.0,如有知道cin.getline()的内部实现的,恳请指教!