关于cin.getline()

来源:互联网 发布:淘宝客刚建群话术 编辑:程序博客网 时间:2024/06/05 06:32

      在网上查过关于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()的内部实现的,恳请指教!