用C键盘打破FOR循环

时间:2014-09-20 07:27:26

标签: c for-loop

我有一个程序在开始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;
}

感谢所有提供链接和有用答案的人。外部循环的问题比仅仅破坏它更复杂。但是,如果任何未来的访问者想知道如何用键盘按键打破循环,这已经实现了。查看正确答案或简化代码。

4 个答案:

答案 0 :(得分:3)

您可以尝试使用kbhitgetchar来检查按键并相应地处理操作。 查看此帖子: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)

您可以尝试使用用户定义的中断