getchar()在哪里进入第二轮

时间:2014-04-22 08:25:25

标签: c sockets network-programming printf

我正在尝试创建一个交互式套接字通信客户端程序,该程序在用户请求时向服务器发送消息,并在同一套接字上接收传入消息(一旦连接)。由于这些消息可能无序到达,并且我使用非阻塞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循环结束时检查。可疑信号处理程序可能是罪魁祸首,我试图在没有处理程序的情况下使该条件成立,但是,无济于事。

有什么想法吗?

2 个答案:

答案 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()消耗,并且将来不会产生问题。