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