C++清除输入缓冲区(最后没有换行符)

C++清除输入缓冲区(最后没有换行符),c++,linux,stdin,cin,C++,Linux,Stdin,Cin,我有一个服务器,它使用select accept处理多个客户端 客户端可以连接并向服务器发送消息,服务器可以随时向任何客户端发送消息。 客户端使用accept检查stdin和socket中的消息 假设两个客户端同时连接。第一个客户机开始向服务器输入消息,同时,服务器根据第二个客户机的消息向第一个客户机发送消息。第一个客户端在换行后立即显示servers消息,从而中断控制台输入。然后,第一个客户端重新键入消息并按enter键,但问题是在服务器消息到达之前输入的消息的未完成部分也正在发送 控制台上的

我有一个服务器,它使用select accept处理多个客户端

客户端可以连接并向服务器发送消息,服务器可以随时向任何客户端发送消息。 客户端使用accept检查stdin和socket中的消息

假设两个客户端同时连接。第一个客户机开始向服务器输入消息,同时,服务器根据第二个客户机的消息向第一个客户机发送消息。第一个客户端在换行后立即显示servers消息,从而中断控制台输入。然后,第一个客户端重新键入消息并按enter键,但问题是在服务器消息到达之前输入的消息的未完成部分也正在发送

控制台上的可能结果:

./client
Server says: Hi Tom! Use commands get, set, exit.
Tom> exi
Server says: Your friend<Peter> arrived.
Tom> exit
服务器获取exiexit而不是exit

问题是如何清理输入?我尝试了以下方法和组合:

std::cin.ignore(INT_MAX);
std::cin.ignore(INT_MAX, '\n');
while ((ch = getchar()) != '\n' && ch != EOF);
scanf("%c%*[^\n]%*c", &c);
std::getline(std::cin, buffer);
gets(buffer);
std::cin.sync();
std::cin.seekg(0, std::cin.end);

但是主要的问题是操作阻塞,所以我必须按enter键,或者它不能清除输入,或者两者都有。

这是在便携式C/C++中不容易做到的。您需要做的是与终端进行更强烈的交互,以便能够精确地控制发生的事情

例如,在Linux上,有一个ncurses库,它可以帮助您在终端中移动光标并逐字符读取,而无需行缓冲等。这将允许您在stdout上重新打印部分输入行,以便用户可以看到实际发生的情况。这方面的低级API是termios见man 3 termios


在Windows上也有类似的可能性,但有一个非常不同的界面。

这是在便携式C/C++中不容易做到的。您需要做的是与终端进行更强烈的交互,以便能够精确地控制发生的事情

例如,在Linux上,有一个ncurses库,它可以帮助您在终端中移动光标并逐字符读取,而无需行缓冲等。这将允许您在stdout上重新打印部分输入行,以便用户可以看到实际发生的情况。这方面的低级API是termios见man 3 termios


在Windows上也有类似的可能性,但有一个非常不同的界面。

是的,我能够解决ncurses的问题。如果只有standars libs,则在显示服务器消息后,按enter键继续,然后读取一整行temp变量。在Windows上,可以使用conio.h中的函数,如getch。谢谢,我用ncurses解决了这个问题。如果只有standars libs,则在显示服务器消息后,按enter键继续,然后读取一整行temp变量。在Windows上,可以使用conio.h中的函数,如getch。谢谢
std::cin.ignore(INT_MAX);
std::cin.ignore(INT_MAX, '\n');
while ((ch = getchar()) != '\n' && ch != EOF);
scanf("%c%*[^\n]%*c", &c);
std::getline(std::cin, buffer);
gets(buffer);
std::cin.sync();
std::cin.seekg(0, std::cin.end);