我正在尝试创建一个交互式套接字通信客户端程序,该程序在用户请求时向服务器发送消息,并在同一套接字上接收传入消息(一旦连接)。由于这些消息可能无序到达,并且我使用非阻塞IO,因此如果用户中断了程序以输入更多选项,我打算在每个选择结束时检查一个标志。
对于get_user_opts()
的第一次调用,该函数运行正常并从用户那里获取输入,但对于后续调用,它不会等待用户输入。
在gdb中运行它说:
getchar () at getchar.c:37
37 getchar.c: No such file or directory.
in getchar.c
(gdb)
38 in getchar.c
(gdb)
37 in getchar.c
(gdb)
_IO_acquire_lock_fct () at libioP.h:984
984 libioP.h: No such file or directory.
in libioP.h
(gdb)
985 in libioP.h
(gdb)
getchar () at getchar.c:41
41 getchar.c: No such file or directory.
in getchar.c
(gdb)
get_user_opts () at ../testmain.c:444
444 switch(user_opt){
(gdb)
597 printf("\n Unknown Option. Exiting\n");
(gdb) print user_opt
$1 = 10 '\n'
相关的代码段是:
void get_user_opts(){
/***************************************************************************/
/* User Interactivity variables */
/***************************************************************************/
unsigned char user_opt;
/***************************************************************************/
/* Initialization started. Ask user for options */
/***************************************************************************/
printf("\n************************************\n Options: \n\t1 - Open Connection "\
"\n\t2 - Send Register\n\t3 - Send Unregister\n\t4 - Send Add Session" \
"\n\t5 - Send Delete Session\n\t6 - Send Startup done\n"\
"**************************************\n");
// fflush(stdin);
//scanf("%c", &user_opt);
user_opt = getchar();
switch(user_opt){
case '1':...
信号处理程序切换一个标志,该标志在每个while循环结束时检查。可疑信号处理程序可能是罪魁祸首,我试图在没有处理程序的情况下使该条件成立,但是,无济于事。
有什么想法吗?
答案 0 :(得分:1)
变化:
user_opt = getchar();
到
user_opt = getchar();
while( user_opt != '\n' && getchar() != '\n' )
{
// do nothing
}
这将删除从行缓冲区分配给user_opt
的任何字符 - 包括不可避免的'\ n'。
大多数系统上的控制台都是行缓冲的,所以getchar()
在整个行被缓冲之前不会返回(即你按下了ENTER);那么你至少有两个字符缓冲=你输入的字符和按ENTER键的换行符。如果您不删除所有缓冲的字符,getchar()
将在后续呼叫中立即返回。循环继续获取字符,直到找到换行符,但如果用户只需按ENTER键,则检查user_opt
。
答案 1 :(得分:1)
使用此:
unsigned char user_opt, tempChar;
while((tempChar = getchar())!='\n') user_opt = tempChar;
...
这将删除换行符问题。这是有效的,因为while
循环将确保newline
字符被getchar()
消耗,并且将来不会产生问题。