Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf()函数未保留用户输入数据的屏幕_C_Multithreading_Sockets - Fatal编程技术网

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)…:)时,某些程序会以奇怪的方式工作。只是猜测一下