C/C++清空控制台输入缓冲区

这篇具有很好参考价值的文章主要介绍了C/C++清空控制台输入缓冲区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天我再写一个群聊小demo的时候发现了一个问题,我在客户端首先使用了scanf输入了昵称 然后开启了发消息线程和收消息线程,在发消息线程函数如下:

unsigned WINAPI sendMsg(void* arg)
{
	//发送消息给服务端
	SOCKET ClientSocket = *((SOCKET*)arg);
	char msg[MAX_SIZE] = { 0 };
	char name_msg[MAX_SIZE + MAX_NAME_SIZE] = { 0 };
	for (;;)
	{
		memset(msg, 0, MAX_SIZE);
		//阻塞在这一句直到接收到控制台输入
		fgets(msg, MAX_SIZE, stdin);
		if (!strcmp(msg, "Q\n") || !strcmp(msg, "q\n"))
		{
			//客户端口下线
			closesocket(ClientSocket);
			exit(0);
		}
		//将消息拼包发送给服务器
		sprintf(name_msg, "%s :%s", nickName,msg);
		send(ClientSocket, name_msg, strlen(name_msg), 0);
	}
	return 0;
}

这里使用了fgets函数来接收控制台输入,但是输入昵称之后立马就发送了一个消息,原因就是scanf输入之后并没有清空输入缓冲区,所以输入完回车之后立马就触发了fgets函数,为了解决这个问题我在scanf输入之后,发送线程开启之前清空了输入缓冲区。

	//清空输入缓冲区
	while (getchar() != '\n') {
		continue;
	}

所以这里注意到了这个问题然后这里总结了一些C/C++中清空输入缓冲区的方法文章来源地址https://www.toymoban.com/news/detail-688991.html

法一:
while (getchar() != '\n') {
		continue;
	}

法二:
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入缓冲区

法三:
    while (cin.get() != '\n') {
        continue;
    }
法四:
 cin.clear();    // 重置输入流的错误状态
 cin.sync();     // 清空输入缓冲区

到了这里,关于C/C++清空控制台输入缓冲区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • scanf老是出错?带你详细解决输入缓冲区问题

    我们一般在进行 输入输出的时候,就会用到 scanf / printf 。 并且根据格式指定可以输入输出各种类型的数据 。可以 输入整形,字符,浮点型等其他类型的数据。 今天呢我先给大家再介绍一下 getchar 和 putchar. getchar呢是读取一个字符,并且只能读取一个字符。putchar呢则是输出

    2024年02月05日
    浏览(34)
  • c++文件的打开、读写和关闭。缓冲区的使用和控制。

    在C++中,文件的打开、读写和关闭通常使用标准库中的文件流对象(如std::ifstream用于输入文件,std::ofstream用于输出文件)来完成。这些对象封装了与操作系统交互的底层细节,使得文件操作更为简单和安全。 以下是文件打开、读写和关闭的基本步骤: 包含头文件 首先,需

    2024年02月21日
    浏览(42)
  • Python 清空控制台的几种方法

    我们在写代码的时候经常会发现:当Python控制台输入过多的Python语句时,有时需要将这些已经输入的语句和执行结果清空,并重新开始输入Python语句。我们不再想要展现控制台上显示的内容,需要将他们 清空 ,我们该怎样做呢? 我们在Python Console中输入reset 但是这种方法也

    2024年02月09日
    浏览(45)
  • C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态

    文本文件一般以行的形式组织数据。 包含头文件: #include fstream 类: ofstream(output file stream) ofstream 打开文件的模式(方式):类内open()成员函数参数2.参数1是文件存储/创建路径 例如:fout.open(filename,ios::app); 对于 ofstream,不管用哪种模式打开文件,如果文件不存在,都会创

    2024年01月25日
    浏览(52)
  • 【C语言趣味教程】(8) 标准 IO 流:输入和输出 | 标准输入 stdin | 标准输出 stdout | 详解 printf 和 scanf | 探讨 scanf 缓冲区问题和安全性问题

        🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 引入:I/O 的概念 计算机中的输入和输出,简称 ,其中:  代表 Input,即输入。

    2024年02月09日
    浏览(51)
  • 8.缓冲区管理

    双缓冲区:TC+M 假设初始状态缓冲区1满,缓冲区2空,工作区为空。 刚开始缓冲区2为空,所以设备可以向缓冲区2中冲入数据耗时T,另一方面刚开始缓冲区1中是满的,所以刚开始就可以把缓冲区1中的数据传送到工作区中,M时刻工作区被充满,CPU就开始处理数据耗时C,处理完

    2024年02月11日
    浏览(42)
  • Redis 缓冲区

    缓冲区的应用场景 : 客户端与服务器端的通信时,暂存客户端发送的命令数据,或暂存服务器端返给客户端的数据结果 主从节点间进行数据同步时,暂存主节点接收的写命令和数据 缓冲区 : 避免客户端和服务器端的请求发送和处理速度不匹配 服务器给每个连接的客户端都准

    2024年02月07日
    浏览(69)
  • 理解缓冲区

    对于这样的代码,首先可以肯定的是 printf 语句先于 sleep 执行,既然如此那么就应该是先打印语句然后进行休眠,下面看看结果: 但这里却是先休眠以后再打印语句,这是因为存在一个叫缓冲区的东西,当我们要向外设写入数据(让显示器显示就是向显示器写入数据)时会将

    2023年04月25日
    浏览(72)
  • 【Linux】理解缓冲区

    我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关! C接口的函数被打印了两次系统接口前后只是打印了一次:和fork函数有关,fork会创建子进程。在创建子进程的时候,数据会被处理成两份,父子进程发生写时拷

    2024年01月23日
    浏览(54)
  • 【Linux】文件缓冲区

    提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区 通过自己实现库中的一些文件操作函数更加深入的理解文件缓冲区 自定义实现

    2024年02月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包