0

我曾经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");
4

3 回答 3

2
  • 您在标准输入中留下尾随换行符。这个问题是一个常见问题,每天至少被问 5 个计时器。在此站点上搜索 scanf... 解决方案:scanf(" %s", msg);或类似的。
  • 您不能scanf在线程内部使用普通和类似的库函数,它们不是线程安全的。
  • 您使用它的方式scanf很容易受到攻击,并且会导致缓冲区溢出。
于 2013-04-04T12:36:51.623 回答
0

缓冲区中可能有“\r”或“\n”。我们需要刷新输入缓冲区才能将其删除。

使用fflush (stdin) 函数刷新缓冲区。

fflush(stdin)  
scanf("%s", msg );  

编辑:您是否尝试使用 fgets 而不是 scanf ?

fgets(msg);
于 2013-04-04T12:16:25.817 回答
-1

试试这个,看看它是否有效

     printf("Enter data:");
      scanf("\n%s",msg);

while(strcmp(msg,"exit")!=0)
{
   send(sock_s,msg,sizeof(msg),0);
        scanf("\n%s",msg);


}

我认为while循环可能有问题

于 2013-04-04T12:40:35.810 回答