如何退出while(cin >> s)

代码示例

void test_allocator_str()
{
	cout << "input string for allocator, waiting ...\n";
	int n = 100;
	allocator<string> alloc;
	auto const p = alloc.allocate(n);
	auto q = p;

	string s;	
	while (cin >> s && q != p + n)
	    alloc.construct(q++, s);
	
	for_each(p, q, [](string str){
	    cout << str << " ";
	});
	
	while(q != p) 
	    alloc.destroy(--q);
	
	alloc.deallocate(p, n);
}

结果

分析

    // 当从键盘上输入一串字符并按回车之后,这些字符首先被送到输入缓存区中。
    // 每当按下回车键之后,cin.get()就会检查输入缓存区中是否有字符串可读。
    // cin.get()并检查是否有流输入结束标识符Ctrl+Z(win)或Ctrl+D(Linux)
    
    // 检查方式有两种:阻塞(Windows)和非阻塞(Linux)
    
    // 阻塞式检查:只有在回车按下时,才检查缓存区字符串
    
    // 特点:
    // 0.Ctrl+Z:为流结束信号
    // 1.只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下;
    // 2.如果输入缓冲区中有可读的数据则不会检测Ctrl+Z
    //(因为有要读的数据,^z不会产生字符,以及^z之后的数据,都不会被存储到输入缓冲区中)。
    
    // 非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。
    // 如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,
    // 即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。
    // 如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。

    // Windows一般使用阻塞式检查Ctrl+Z,Linux一般使用非阻塞式检查Ctrl+D。

参考

https://blog.csdn.net/weixin_33752045/article/details/86174521

posted @ 2021-12-30 11:45  绍荣  阅读(336)  评论(0编辑  收藏  举报