scanf()的函数并不保持在屏幕用户输入数据

scanf()的函数并不保持在屏幕用户输入数据

问题描述:

我已经使用scanf()保持屏幕,并采取由用户输入在一个多线程客户端套接字程序。 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); 
} 

和代码中创建线程t这是:

 status_s=pthread_create(&thread_s,NULL,send_data,(void *)&sock); 
      if(status_s==0) 
        printf("sending"); 
+0

什么味精scanf函数返回后,包含哪些内容? – stdcall 2013-04-04 12:32:58

+2

请在发布到本网站之前尽一切努力来修复杂乱的凹痕。 – Lundin 2013-04-04 12:32:59

+0

你是什么意思,“拿着屏幕”?我可以看到你想与用户交互,为什么不用read()来代替。 'n = read(STDIN_FILENO,&msg [0],49); msg [n] ='\ 0';'这可能无法解决您的问题,但您将不再使用这些功能。 – yeyo 2013-04-04 12:36:12

缓冲可能在它是“\ R”或“\ n”。我们需要刷新输入缓冲区以将其删除。

使用fflush(标准输入)函数以冲洗缓冲液。

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

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

fgets(msg); 
+2

不,fflush(stdin)根据C标准给出未定义的行为。 – 2013-04-04 12:19:35

+0

仍然无法正常工作.... – user3032010 2013-04-04 12:21:07

+0

@kanika我更新了我的文章。 – m1o2 2013-04-04 12:29:06

  • 您在标准输入离开尾随换行符。这个问题就是这样一个常见问题,每天至少要有5个计时器。搜索本网站上的scanf ...解决方案:scanf(" %s", msg);或类似。
  • 不能使用纯scanf和类似的库函数从一个线程里面,他们不是线程安全的。
  • 您使用它的方式,scanf是脆弱的,并会得到缓冲区溢出。
+0

他使用scanf(“%s”),是不是?所以这似乎不是通常的fgets-reads-an-old-newline问题。 – 2013-04-04 12:38:31

+0

@ ThomasPadron-McCarthy请注意格式字符串中的空格。 '%s'alone不能修复尾随行提要。 – Lundin 2013-04-04 12:45:16

+1

'%s'转换跳过了最初的空格。只有'%c','%['和'%n'转换不会。 – 2013-04-04 13:19:55

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

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

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


} 

我想可能有一些问题与while循环

+0

这是做同样的事情,这将解决什么? – Lundin 2013-04-04 12:47:01

+0

@Lundin一些程序以奇怪的方式工作时while(1).. :)。只是一个猜测 – raghav710 2013-04-04 14:41:50

+1

不,他们不。 – Lundin 2013-04-04 15:01:32