【发布时间】:2014-09-20 07:27:26
【问题描述】:
我有一个程序在开始 for (;;) 循环之前运行了几个步骤。
我希望能够打破;这个for 循环使用按键(例如,'e' 用于退出)
我尝试过scanf_s,但我认为我没有正确使用它们。如果我尝试将scanf_s 写入其中,则循环不会启动。
我对 C 编程不是很熟悉,所以我有点挣扎。
有人能解释一下吗?
额外信息:
操作系统是Win 8.1。
Program 是一个 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;
}
感谢所有提供链接和有用答案的人。事实证明,外循环的问题比仅仅打破它更复杂。但是,如果任何未来的访问者想知道如何通过键盘按下来打破循环,那么这已经实现了。请参阅正确答案或我的简化代码。
【问题讨论】:
-
你能用你的程序启发我们吗,否则很难说出哪里出了问题,而且中断是一个强词(在这种情况下是错误的)你可以使用“break”
-
C 不为我认为您要求做的事情提供任何本机支持。你的操作系统是什么?
-
没有标准的 C 函数可以检查击键。您需要为此使用特定于实现的 API。由于您似乎在 Windows 上,请查看 here(second 答案)。
-
你需要使用
SetConsoleCtrlHandler和朋友。 Handle CTRL+C on Win32 的可能重复项。 -
如果您有其他问题,请提出单独的问题。很难理解您修改后的问题是什么。如果你想跳出外循环,问一个关于跳出外循环的问题。请注意,它与检查键盘敲击无关,因为您已经知道要中断。