我有一个程序在开始for (;;)
循环之前经过几个步骤。
我希望能够打破;这个for
循环使用击键(例如'e
'用于退出)
我试过scanf_s
,但我认为我没有正确使用它们。如果我尝试在{。}中编写scanf_s
,则循环不会启动。
我对C编程不太熟悉,所以我有点挣扎。
有人可以对此有所了解吗?
额外信息:
操作系统是Win 8.1。
程序是TCP服务器程序。它创建一个套接字并开始监听。然后它开始接受for
循环中的客户端连接。然后开始另一个for
循环以接收来自客户端的消息。
编辑:使用this我已设法使用s
停止第二个for循环。将更改添加到简化代码中(并且只是如下)。
加入:
if (_kbhit()) {
key = _getch();
if (key == 's');
break;
}
这里有一些简化的代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// prelim info goes here
// like SOCKET
// and struct sockaddr_in
// Initialize Winsock
WSAStartup();
// Create socket
mysocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// server parameters go here
// like sin_addr and sin_port
bind(mysocket);
// start listening
listen(mysocket, SOMAXCONN);
// begin the damn for loops
for (;;)
{
myclient = accept();
//second for loop
for (;;)
{
receivedata = recv(myclient);
printf(<data>)
if (_kbhit()) {
key = _getch();
if (key == 's');
break;
}
}
}
// close socket
closesocket(mysocket);
// call WSACleanup
WSACleanup();
return 0;
}
感谢所有提供链接和有用答案的人。外部循环的问题比仅仅破坏它更复杂。但是,如果任何未来的访问者想知道如何用键盘按键打破循环,这已经实现了。查看正确答案或简化代码。
答案 0 :(得分:3)
您可以尝试使用kbhit
和getchar
来检查按键并相应地处理操作。
查看此帖子:Return pressed key without enter for confirmation
当按下e
时,此代码会中断while循环:
[代码更新了一个额外的while循环]
#include <stdio.h>
#include <conio.h>
int main(){
int ch = '1';
while(ch != 'e'){ //outer while for accepting connection
printf("waiting for connection\n"); //do something
while(ch != 'e'){ //inner while for checking key press
if(kbhit()) //if key is pressed
ch = getch(); //get the char and set ch to 'e'
}
}
return 0;
}
旧代码使用break:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main(){
int ch;
while(1){
printf("*");
if(kbhit()){ //if key is pressed
ch = getch(); //get the char
if(ch == 'e') //if pressed key is 'e'
break; //break while loop
}
}
return 0;
}
答案 1 :(得分:1)
假设微软的编译器,最简单的方法是使用它的conio库。我建议将细节包装到单个函数中,以允许重用。例如,您可能需要在进入第二个循环之前测试键盘。
#include <conio.h>
int nonBlockingGetch( void )
{
int ch = -1 ;
if( _kbhit() )
{
ch = _getch() ;
}
return ch ;
}
int main( void )
{
int ch = -1 ;
// Outer loop
while( ch != 'e' )
{
// inner loop
while( ch != 'e' )
{
ch = nonBlockingGetch() ;
}
}
return 0;
}
正如我所建议的那样,如果请求退出,您可能不希望内循环运行,在这种情况下:
// Outer loop
while( ch != 'e' )
{
ch = nonBlockingGetch() ;
// inner loop
while( ch != 'e' )
{
ch = nonBlockingGetch() ;
}
}
答案 2 :(得分:0)
只需在for循环中输入这些行。当用户输入&#39; e&#39;焦炭。
if(kbhit()){
ch = getch();
if(ch == 'e')
break;
}`
答案 3 :(得分:-1)
您可以尝试使用用户定义的中断