第二次运行时getchar()到哪里去了

第二次运行时getchar()到哪里去了,c,sockets,network-programming,printf,C,Sockets,Network Programming,Printf,我正在尝试制作一个交互式套接字通信客户端程序,当用户请求时,它向服务器发送消息,并在同一套接字上接收传入消息(一旦连接)。由于这些消息可能会无序到达,并且我使用的是非阻塞IO,因此我打算检查每个select的末尾是否有一个标志,如果用户中断了程序以输入更多选项 对于第一次调用get_user_opts(),函数运行良好,并从用户处获取输入,但对于后续调用,它不等待用户输入 在gdb中运行它会显示: getchar () at getchar.c:37 37 getchar.c: No such

我正在尝试制作一个交互式套接字通信客户端程序,当用户请求时,它向服务器发送消息,并在同一套接字上接收传入消息(一旦连接)。由于这些消息可能会无序到达,并且我使用的是非阻塞IO,因此我打算检查每个select的末尾是否有一个标志,如果用户中断了程序以输入更多选项

对于第一次调用
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循环结束时检查的标志。由于怀疑信号处理程序可能是罪魁祸首,我尝试在没有处理程序的情况下使该条件为真,但没有任何效果

有什么想法吗?

改变:

user_opt = getchar();

这将从行缓冲区中删除分配给
user\u opt
的所有字符,包括不可避免的'\n'

大多数系统上的控制台都是行缓冲的,因此
getchar()
在整个行缓冲之前不会返回(即,您按下了ENTER键);然后至少缓冲了两个字符=输入的字符和按ENTER键的换行符。如果不删除所有缓冲字符,
getchar()
将在后续调用中立即返回。循环继续获取字符,直到找到换行符,但如果用户只是按ENTER键,则会检查
user\u opt

使用以下方法:

unsigned char user_opt, tempChar;
while((tempChar = getchar())!='\n') user_opt = tempChar;
...

这将消除换行符问题。它之所以有效,是因为
while
循环将确保
换行符被
getchar()
使用,并且不会在将来产生问题。

这实际上是两个单独的进程执行还是两个单独的
get\u user\u opts()
?两个单独的get\u user\u opts()调用在单次执行流中,文本“对于第一次运行,程序运行良好,并从用户处获取输入,但是对于随后的运行,…”非常具有误导性。调用、不运行和函数不编程。此外,GDB清楚地表明调用了getchar(),因此它显然没有拒绝“确认存在”
getchar()
。它可以工作!但请解释一下,我的意思是,为什么会出现这个问题。即使是fflush(stdin)也没有解决这个换行符问题。:)@Anshul当您从用户获取输入时,完成后按Enter键。您还必须读取Enter键,上面的循环就是这么做的。这是未定义的
fflush(stdin)
的功能,所以在您的平台上,它并没有做您期望它做的事情。@Anshul:为答案添加了进一步的解释。w、 r.t.
fflush()
,它不是为输入流定义的。它在Microsoft的C运行时中刷新输入,但在GNU libc中没有效果。@Clifford非常感谢,我对使用fflush感到困惑,我认为它对stdout有未定义的行为。谢谢你在那里纠正我,谢谢你的编辑。也谢谢你的解释:)
unsigned char user_opt, tempChar;
while((tempChar = getchar())!='\n') user_opt = tempChar;
...