scanf()函数未保留用户输入数据的屏幕
我使用了scanf()函数未保留用户输入数据的屏幕,c,multithreading,sockets,C,Multithreading,Sockets,我使用了scanf()在多线程客户端套接字程序中保持屏幕并从用户处获取输入。 scanf()未在此处保留屏幕,用户无法输入数据。 线程函数的代码为: void *send_data(void *num) { int *sock_s=(int *) num; int sock=*sock_s; char msg[50]; printf("Enter data:"); while(1) { scanf("%s",msg);
scanf()
在多线程客户端套接字程序中保持屏幕并从用户处获取输入。
scanf()
未在此处保留屏幕,用户无法输入数据。
线程函数的代码为:
void *send_data(void *num)
{
int *sock_s=(int *) num;
int sock=*sock_s;
char msg[50];
printf("Enter data:");
while(1) {
scanf("%s",msg);
if(strcmp(msg,"exit")==0)
{
break;
}
send(sock_s,msg,sizeof(msg),0);
}
send(sock,msg,sizeof(msg),0);
}
创建此线程的代码为:
status_s=pthread_create(&thread_s,NULL,send_data,(void *)&sock);
if(status_s==0)
printf("sending");
缓冲区中可能有“\r”或“\n”。我们需要刷新输入缓冲区以删除它
使用(stdin)函数刷新缓冲区
fflush(stdin)
scanf("%s", msg );
编辑:您是否尝试使用FGET而不是scanf
fgets(msg);
- 在stdin中保留尾随换行字符。这个问题就是这样一个常见问题,每天至少要问5个计时器。在此网站上搜索scanf。。。解决方案:
scanf(“%s”,msg)代码>或类似
- 不能从线程内部使用普通的
和类似的库函数,它们不是线程安全的scanf
- 您使用它的方式,
易受攻击,会导致缓冲区溢出scanf
printf("Enter data:");
scanf("\n%s",msg);
while(strcmp(msg,"exit")!=0)
{
send(sock_s,msg,sizeof(msg),0);
scanf("\n%s",msg);
}
我认为while循环可能存在一些问题否,根据C标准,fflush(stdin)给出了未定义的行为。scanf返回后,msg包含哪些内容?请在发布到该网站之前尽可能地修复混乱的缩进。你说的“保持屏幕”是什么意思?我知道你想与用户交互,为什么不改用read()呢<代码>n=读取(标准文件号和消息[0],49);msg[n]='\0'代码>这可能无法解决您的问题,但您将不再使用这些函数。
send(sock_s,msg,sizeof(msg),0)
错误,send
的第一个参数是int
。你的意思是sock
在那里。@danielfescher发现得很好,你应该把它作为一个答案,它可能就是OP正在寻找的bug。无论如何,这绝对是一个bug。他正在使用scanf(“%s”),不是吗?所以这似乎不是通常的fgets读取旧换行符的问题。@ThomasPadron McCarthy请注意格式字符串中的空格<仅代码>%s不能修复尾随换行符。%s
转换跳过初始空白。只有%c
,%[
和%n
转换不起作用。@Lundin:正如Daniel Fischer所写,“%s”和“%s”在这里的作用相同,因为“%s”已跳过初始空白。如果OP的问题是程序没有停止并等待输入,这似乎不是由常见的尾随换行常见问题解答引起的。@Lundin当while(1)…:)时,某些程序会以奇怪的方式工作。只是猜测一下